注意:答案中不可以包含重复的三元组。
例如, 给定数组 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》 杂度。
解题思路:
-
首先对数组进行排序,排序后固定一个数nums[i],再使用左右指针指向nums[i]后面的两端,数字分别为nums[L]和nums[R],计算三个数的和sum判断是否满足为0,满足则添加进结果集;
-
如果nums[i]大于0,则三数之和必然无法等于0,结束循环;
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-3DVeU9Eu-1650345713208)]