题解 | #数组中相加和为0的三元组#

数组中相加和为0的三元组

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

首先,我们先对数组进行排序处理。
然后,确定固定指针i,与双指针j,k。其中固定位从0开始,j从i起始的下一位向左移动,k从数组末端向右移动。
①提前结束的条件 num[i]>0
因为i < j < k,所以num[i]>=num[j]>=num[k]。因此如果num[i]>0,不可能使三个大于0的数之和等于0
②重复数字跳过
在有序数组中,如果遍历当相邻位的值相同,直接跳过。
③循环流程
如果三数之和sum>0,k向左移动
如果sum<0,j向右移动
如果sum == 0,记录i、j、k
i、j继续移动寻找当前固定指针下的其他解,直到左右指针碰撞结束循环。
固定指针向前移动,并开始新循环。
固定指针时间复杂度O(N),移动指针ij时间复杂度O(N),嵌套之后时间复杂度O(N)

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {'
        //先对数组进行排序
        Arrays.sort(num);
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        for(int i=0; i<num.length-2; i++){
            int j = i + 1, k = num.length - 1;
            //如果固定位大于0,已经不可能找到三数和为0的数,提前退出
            if(num[i] > 0)break;
            //如果相邻数重复,直接跳过
            if(i > 0 && num[i] == num[i-1])continue;
            while(j < k){
                int sum = num[i] + num[j] + num[k];
                if(sum > 0){
                    while(j < k && num[k] == num[--k]);
                }
                else if(sum < 0){
                    while(j < k && num[j] == num[++j]);
                }
                else{
                    res.add(new ArrayList<Integer>(Arrays.asList(num[i], num[j], num[k])));
                    while(j < k && num[k] == num[--k]);
                    while(j < k && num[j] == num[++j]);
                }
            }
        }
        return res;
    }
}
全部评论

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务