15 三数之和

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

一. 暴力法,直接用三个指针遍历数组

public static List<List> threeSum(int[] nums)

{

Arrays.sort(nums); //数组排序

List<List<Inte 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》开源 ger>> outList = new ArrayList<List>(); //定义一个ArrayList线性表

for (int i = 0; i < nums.length; i++)

{

if ((i > 0 && nums[i] == nums[i - 1])) //去重,做判断。如果符合条件就返回循环,对应的i直接跳过

continue;

for (int j = i + 1; j < nums.length; j++)

{

if ((j > i + 1 && nums[j] == nums[j - 1])) //去重

continue;

for (int k = j + 1; k < nums.length; k++)

{

if ((k > j + 1 && nums[k] == nums[k - 1])) //去重

continue;

if ((nums[i] + nums[j] + nums[k] == 0)) //判断和为零

{

outList.add(Arrays.asList(nums[i],nums[j],nums[k])); //添加到ArrayList中

break;

}

}

}

}

return outList; //返回找到的符合条件的数组

}

最终测试代码在这里插入图片描述

这时我们发现,超时了,这里的时间复杂度是O(n^3)。仔细分析我们知道循环太多了,而且都是三个for嵌套,这样直接导致了时间复杂度飙升。

那么我们想办法降低下时间复杂度。

二. 头尾指针法

方法一是三个指针依次数组后面移,那么我们试下头尾加指针,缩小范围来减小时间复 Android开源项目《ali1024.coding.net/public/P7/Android/git》 杂度。

解题思路:

  1. 首先对数组进行排序,排序后固定一个数nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为nums[L]和nums[R],计算三个数的和sum判断是否满足为0,满足则添加进结果集;

  2. 如果nums[i]大于0,则三数之和必然无法等于0,结束循环;

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)


复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-3DVeU9Eu-1650345713208)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值