ethan

ethan

新知,热爱生活,码农,读书
twitter
email
github

LCR 15. 三數之和

給你一個整數數組 nums,判斷是否存在三元組 [nums [i], nums [j], nums [k]] 滿足 i != j、i != k 且 j != k ,同時還滿足 nums [i] + nums [j] + nums [k] == 0 。請你返回所有和為 0 且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例 1:
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。
注意,輸出的順序和三元組的順序並不重要。
示例 2:
輸入:nums = [0,1,1]
輸出:[]
解釋:唯一可能的三元組和不為 0 。
示例 3:
輸入:nums = [0,0,0]
輸出:[[0,0,0]]
解釋:唯一可能的三元組和為 0 。

解法 1:雙指針

func threeSum(nums []int) (ans [][]int) {
    sort.Ints(nums)
    n := len(nums)
    for i, x := range nums[:n-2] {
        if i > 0 && x == nums[i-1] { // 跳過重複數字
            continue
        }
        if x+nums[i+1]+nums[i+2] > 0 { // 優化一
            break
        }
        if x+nums[n-2]+nums[n-1] < 0 { // 優化二
            continue
        }
        j, k := i+1, n-1
        for j < k {
            s := x + nums[j] + nums[k]
            if s > 0 {
                k--
            } else if s < 0 {
                j++
            } else {
                ans = append(ans, []int{x, nums[j], nums[k]})
                for j++; j < k && nums[j] == nums[j-1]; j++ {} // 跳過重複數字
                for k--; k > j && nums[k] == nums[k+1]; k-- {} // 跳過重複數字
            }
        }
    }
    return
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。