LeetCode刷題系列15

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

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

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

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



來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/3sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
  • C++編程實現
排序 + 雙指針

本題的難點在於如何去除重複解。
算法流程:

    特判,對於數組長度n,如果數組爲null或者數組長度小於3,返回[]。
    對數組進行排序。
    遍歷排序後數組:
        若nums[i]>0:因爲已經排序好,所以後面不可能有三個數加和等於0,直接返回結果。
        對於重複元素:跳過,避免出現重複解
        令左指針L=i+1,右指針R=n−1,當L<R時,執行循環:
            當nums[i]+nums[L]+nums[R]==0,執行循環,判斷左界和右界是否和下一位置重複,去除重複解。並同時將L,R移到下一位置,尋找新的解
            若和大於0,說明nums[R]太大,R左移
            若和小於0,說明nums[L]太小,L右移

複雜度分析

    時間複雜度O(n2),數組排序O(NlogN),遍歷數組O(n),雙指針遍歷O(n),總體O(NlogN)+O(n)∗O(n),O(n2)
    空間複雜度:O(1)

作者:zhu_shi_fu
鏈接:https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int nsize = nums.size();
        if (nsize < 3)
            return {};
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        int l, r;
        for (int i=0; i<nsize-2; i++)
        {
            if(nums[i]>0) break;
            if(i > 0 && nums[i] == nums[i-1]) continue;
            l = i+1;
            r = nsize-1;
            while(l<r)
            {
                int sumnum = nums[i] + nums[l] + nums[r];
                if (sumnum > 0)
                    r--;
                else if(sumnum < 0)
                    l++;
                else
                {
                    res.push_back({nums[i], nums[l], nums[r]});
                    while(l<r && nums[l] == nums[++l]);
                    while(l<r && nums[r] == nums[--r]);
                }
            }
        }
        return res;
    }
};

解題思路如上類似,但是沒有固定的target值,不需要比較最左端值/最右端值與target的大小,因爲是三個數之和與target纔有可比性。

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