题解 | #三数之和#

三数之和

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

public class Solution {
     public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        int n = num.length;
        if (n < 3) {
            return res;
        }
        ArrayList<Set<Integer>> temp = new ArrayList<>();
        Arrays.sort(num);//进行排序
        for (int i = 0; i < n; i++) {
            int cur = num[i];//当前记录值
            int left = 0;
            int right = n - 1;
            //在出去num[i]的子数组中寻找而和为-num[i]的二元组
            do {
                //如果与当前元素相等则指针移动
                if (left == i) {
                    left++;
                } else if (right == i) {
                    right--;
                }
                if (left < right) {
                    int val = cur + num[left] + num[right];//记录当前三元组的值
                    if (val == 0) {
                        //
                        Set<Integer> already = new HashSet<>();
                        already.add(cur);
                        already.add(num[left]);
                        already.add(num[right]);
                        //判断是否重复再添加
                        if (!temp.contains(already)) {
                            temp.add(already);
                        }
                        left++;
                        right--;
                    } else if (val < 0) {
                        left++;
                    } else if (val > 0) {
                        right--;
                    }
                }
            } while (left < right);
        }
        for (Set<Integer> set : temp) {
            ArrayList<Integer> t = new ArrayList<>();
            t.addAll(set);
            if (t.size()==1){
                t.add(0);
                t.add(0);
            }else if (t.size()<3){
                t.add(-t.get(0)-t.get(1));
            }
            t.sort(null);
            res.add(t);
        }
        return res;
    }
}
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务