leetcode18題,經典題目。
題意:給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。
這一類題目包括兩數之和、三數之和、四數之和、還可以拓展到k數之和。解題時可以從兩數之和以及三數之和的求解中拓展開。
解體思路:
排序+雙指標(適當剪枝可提高執行速度)
兩數之和:
對陣列nums進行公升序排序,然後用兩個指標i和j分別指向陣列的頭和尾,指標i和j向彼此靠攏,並判斷nums[i]+nums[j]是否等於target。
三數之和:
在兩數的基礎上多了乙個外層迴圈,在最外層迴圈中固定乙個數(座標為m),在內層迴圈中採用雙指標指向另外兩個數,判斷nums[m]+nums[i]+nums[j]是否等於target。
四數之和:
在三數的基礎上又多加乙個外層迴圈,兩個外層迴圈可固定兩個數,內層雙指標指向剩下的兩個數。
//兩數之和
vector> twosum(vector& nums, int target) );
while(i> threesum(vector& nums) );
while(a> foursum(vector& nums, int target)
*/int a=j+1,b=nums.size()-1;
//剪枝法2:在每一輪通過四個數和的最大值和最小值加以限制
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)
if(nums[i]+nums[j]+nums[b]+nums[b-1]i+1&&nums[j]==nums[j-1]) continue;
while(a);
while(a借助雜湊表(字典)
兩數之和:
遍歷陣列內的每乙個元素nums[i],由元素為鍵,元素的座標為值,將他們存入字典中(dict[nums[i]]=i),再次遍歷陣列nums,對於每個元素nums[j],只需要判斷 target-nums[j] 是否在字典中,如果在且結果列表中還沒有[nums[i],nums[j]],則將[nums[i],nums[j]]加入結果列表中。
三數之和:
類似於兩數之和的思想,不過字典中的鍵是target-nums[i]-nums[j],對應的值是這兩個數構成的組合,即pair(nums[i],nums[j])。
四數之和:
將四個數加法拆解成2個2個數的加法,那麼它可以用類似兩數相加的方法完成。在字典中,陣列中的任意兩數之和作為鍵,對應的值是乙個集合,裡面包含所有和等於鍵的兩個數的座標構成的組合。
**比較好理解:
//兩數之和
vector> twosum(vector& nums, int target) );
map1.erase(nums[j]); //將已經找到的元素對排除
map1.erase(key);}}
}return res;
}//三數之和
vector> threesum(vector& nums) );
res.erase(nums[j]);
}else}}
return result;
}//四數之和,這部分寫得不好,還請路過的大佬指點
vector> foursum(vector& nums, int target)
}
for(int i=0;i0&&nums[i]==nums[i-1]) continue;
for(int j=i+1;ji+1&&nums[j]==nums[j-1]) continue;
int key=target-nums[i]-nums[j];
if(dict.find(key)!=dict.end());
sort(temp.begin(),temp.end());
bool rep=false;
if(!res.empty())}}
if(!rep) res.emplace_back(temp);}}
}}
}return res;
}
快速排序的兩種思路(C 實現)
includeusing namespace std int partition int array,int startindex,int endindex void quicksort int array,int startindex,int endindex 分治 雙邊迴圈法 int parti...
兩數之和,三數之和,最接近的三數之和,四數之和
二數之和 給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...
有效括號的兩種思路
有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。一 陣列 1 空字串可被認為是有效字串,單獨判斷 3 字串的長度必須為偶數,否則不是有效括號 2 利用替換的思想 1 如果 成對出現,用 替換,相當於刪除 2 剩下的,如果有成對的,繼續替換 ...