(js)leetcode 15. 三數之和

M_Eve發表於2020-11-28

題目:

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

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

示例:

給定陣列 nums = [-1, 0, 1, 2, -1, -4],

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

思路:

今天寫這道題有些曲折,好不容易寫完程式碼點選提交,然後超時了

只好重新換個思路,結果換了之後,每次提交總是不對,只好去看了一下官方的思路,但仍然有錯誤

最終,我發現,呼叫js的sort方法有問題,不能直接使用arr.sort(),這樣對負數的排序並不是按照大小排的,應該使用arr.sort((a,b)=>{return a-b}

1. 對陣列進行排序

2. 從 nums 陣列的第一個數開始遍歷

3. 將第 i 個數之後的數字進行兩兩相加組合,判斷兩數之和是否與第i個數的相反數的值相等

   1)若相等,則新增到結果陣列中

   2)若兩數相加的結果比第i個數的相反數小,則左邊的數往右移一位

   3)否則,右邊的數往左移

程式碼實現:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    nums.sort((a,b)=>{return a-b});
    let res = []
    for (let i = 0; i < nums.length; i++) {
        if (i > 0 && nums[i] === nums[i - 1]) continue;
        let sum = 0 - nums[i];
        let left = i + 1, right = nums.length - 1;
        while (left < right) {
            if (nums[left] + nums[right] == sum) {
                res.push([ nums[i],nums[left],nums[right] ]);
                while (left < right && nums[left] == nums[left + 1]) left++;
                while (left < right && nums[right] == nums[right - 1]) right--;
                left++;
                right--;
            }
            else if (nums[left] + nums[right] < sum) {
                left++;
            }
            else {
                right--;
            }
        }
    }
    return res;
};

執行結果:

 

相關文章