【題解】LeetCode-三數之和(3sum)

15. 三數之和

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]

思路
轉化等式:b+c=ab+c = -a
也就是說,找到一個a,需要找出另外的 b,c 使 b+c = -a。
可以考慮用雙指針去搜 b,c。
注意去掉重複值。

解法

class Solution {
    public List<List<Integer>> threeSum(int[] a) {

        Arrays.sort(a); // 先排序

        List<List<Integer>> list = new ArrayList<>();
        int j,k,s;
        for (int i = 0; i < a.length - 2; i++) {
            if (i > 0 && a[i] == a[i - 1]) { // 去重
                continue;
            }

            j = i + 1;
            k = a.length - 1;
            s = 0 - a[i]; // -a[i] = a[j] + a[k]

            while (j < k) {
                if (a[j] + a[k] == s) {
                    list.add(Arrays.asList(a[i], a[j], a[k]));
                    while (j < k && a[j] == a[j + 1]) j++;
                    while (j < k && a[k] == a[k - 1]) k--;
                    j++;
                    k--;
                } else if (a[j] + a[k] < s) { // 值太小,左指針右移
                    while (j < k && a[j] == a[j + 1]) j++;   // 跳過重複值
                    j++;
                } else { // 值太大,右指針左移
                    while (j < k && a[k] == a[k - 1]) k--;
                    k--;
                }
            }

        }
        return list;
    }
}

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章