8.三數之和

題目描述:

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

給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

代碼實現:

  • 很明顯這道題暴力法是行不通的,雖然沒嘗試,但是估計跑出來肯定會超時,暴力法時間複雜度應該是O(n^3),所以我們要儘可能嘗試一些能縮小時間複雜度的方法。
  • 開始寫這道題確實沒什麼思路,但是首先肯定要排序,接着就可以使用指針法,一個指向首位,另一個指向第二位,第三個指向末尾,剩下的就是指針法的基本操作了。
  • 寫這種題最重要的就是一定要在紙上畫,這樣就可以把每一步都看的比較明晰,另外本題中對於去重操作的代碼很多,在指針法中去重是必須考慮的一件事情,一定要注意,要把所有情況考慮周全。
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    var sum = []
    nums.sort((a, b) => a - b)
    if (nums === null || nums.length < 3) {
        return sum
    }
    for (var i = 0; i < nums.length; i++ ) {
        if (nums[i] > 0) {
            break
        }
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue
        }
        var j = i + 1
        var k = nums.length - 1
        while (j < k) {
            var add = nums[i] + nums[j] + nums[k]
            if (add === 0 ) {
                sum.push([nums[i], nums[j], nums[k]])
                while (nums[j] === nums[j + 1]) {
                    j++
                } 
                while (nums[k] === nums[k - 1]) {
                    k--
                }
                j++
                k--
            } else if (add > 0) {
                k--
            } else {
                j++
            }
        }
    }
    return sum
};

在這裏插入圖片描述

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