Leetcode數組Medium | 18. 四數之和

給定一個包含 n 個整數的數組 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重復的四元組。

注意:

答案中不可以包含重復的四元組。

示例:
給定數組 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

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

解答:
排序,兩層循環(huán)遍歷,雙指針,轉化為兩數之和。
注意去重的處理方法:第一個數和第二個數是比較現數和前一個數。第三和第四個數是比較現數和下一個數。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int> > ret;
        sort(nums.begin(),nums.end());
        
        if(nums.size()<4)  //  若數組長度小于4,返回空ret
            return ret;
        
        for(int i=0;i<nums.size();i++){
            if(i&&nums[i]==nums[i-1]) // 第一個數的去重
                continue;
            
            for(int j=i+1;j<nums.size();j++){
                if(j>i+1&&nums[j]==nums[j-1]) //  第二個數的去重
                    continue;
                
                int t1=j+1,t2=nums.size()-1;  //  雙動態(tài)指針
                
                while(t1<t2){
                    vector<int> v;  //  注意v的位置,易錯?。?!
                    int sum=nums[i]+nums[j]+nums[t1]+nums[t2]; //  四數之和
                    if(sum==target){
                        v.push_back(nums[i]);
                        v.push_back(nums[j]);
                        v.push_back(nums[t1]);
                        v.push_back(nums[t2]);
                        while(t1<t2&&nums[t1]==nums[t1+1]) t1++;  // 第三個數的去重,不需使用unique函數
                        while(t1<t2&&nums[t2]==nums[t2-1]) t2--;  //  第四個數的去重
                        t1++;
                        t2--;
                        ret.push_back(v);
                    }
                    else if(sum<target)
                        t1++;
                    else
                        t2--;
                }
            }
        }
        return ret;
    }
};
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 專業(yè)考題類型管理運行工作負責人一般作業(yè)考題內容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,490評論 0 13
  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,351評論 0 3
  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,790評論 1 19
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國旗問題二分查找搜索BFSDFSBacktracking分治動態(tài)...
    第六象限閱讀 4,899評論 0 0
  • 自然選擇還在進行。 這依賴于極強大、穩(wěn)固的時間機制。宇宙的膨脹速度會不會被生命體激增的強占侵略性越過頭?這個毀滅性...
    藏巳閱讀 293評論 0 0

友情鏈接更多精彩內容