题解 | #三数之和#

三数之和

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型一维数组 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> threeSum (int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        // write code here
        if(num.length < 3){
            return res;
        }

        Arrays.sort(num);

        for(int i = 0;i < num.length - 2;i++){
            // 排序后,当前值>0则后续相加一定大于>0
            if(num[i] > 2){
                return res;
            }

            // 重复值跳过
            if(i > 0 && num[i] == num[i - 1]){
                continue;
            }

            // 指针声明
            int cur = num[i];
            // 对撞指针
            int left = i + 1;
            int right = num.length - 1;
            while(left < right){
                int tmp = cur + num[left] + num[right];

                // 找到结果为0的组合
                if(tmp == 0){
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(cur);
                    list.add(num[left]);
                    list.add(num[right]);
                    res.add(list);

                    // 去除重复指针
                    while(left < right && num[left] == num[left + 1]){
                        left++;
                    }

                    while(left < right && num[right] == num[right - 1]){
                        right--;
                    }

                    // 指针移动
                    left++;
                    right--;
                }else if(tmp < 0){
                    left++;
                }else{
                    right--;
                }
            }
        }
        return res;
    }
}

全部评论

相关推荐

网安已死趁早转行:山东这地方有点说法
点赞 评论 收藏
分享
04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务