题解 | #三数之和#

三数之和

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<>();
        if (num.length < 3) {
            return res;
        }
        margeSrt(num, new int[num.length], 0, num.length - 1);

        for (int a = 0; a < num.length; a++) {
            if (a > 0 && num[a] == num[a - 1]) {
                continue;
            }
            if (num[a] > 0) {
                break;
            }
            for (int b = a + 1; b < num.length; b++) {
                if (b > a + 1 && num[b] == num[b - 1]) {
                    continue;
                }
                if (num[a] + num[b] > 0) {
                    break;
                }
                for (int c = b + 1; c < num.length; c++) {
                    if (c > b + 1 && num[c] == num[c - 1]) {
                        continue;
                    }

                    int sum = num[a] + num[b] + num[c];

                    if (sum > 0) {
                        break;
                    }
                    if (sum == 0) {
                        ArrayList<Integer> vs = new ArrayList<>();
                        vs.add(num[a]);
                        vs.add(num[b]);
                        vs.add(num[c]);
                        res.add(vs);
                    }
                }
            }
        }


        return res;
    }

    public void margeSrt(int [] num, int [] tmp, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = left + (right - left) / 2;
        margeSrt(num, tmp, left, mid);
        margeSrt(num, tmp,  mid + 1, right);

        int k = 0, i = left, j = mid + 1;
        while (i <= mid && j <= right) {
            if (num[i] > num[j]) {
                tmp[k++] = num[j++];
            } else {
                tmp[k++] = num[i++];
            }
        }
        while (i <= mid) {
            tmp[k++] = num[i++];
        }
        while (j <= right) {
            tmp[k++] = num[j++];
        }
        for (int ni = left, ti = 0; ni <= right; ni++, ti++) {
            num[ni] = tmp[ti];
        }
    }
}

全部评论

相关推荐

08-15 01:16
Python
Java小萌新新萌小...:照片不用整这么大的 而且你的照片截歪了 你想找专业对口的 那普通话证写在这里其实没有什么必要 就是看着内容多点 而且里面字体大小也不一样 修改一下排版 有很多空间可以再利用一下 字大一点 不然现在这样观感不太好 再就是项目好好优化一下 加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务