陣列中求四數之和(三數之和的思路的基礎上)
阿新 • • 發佈:2019-02-15
題目:
思路:
- 因為是求四個數字之和,所以將i作為第一個數字,其他剩下的三個索引分別為left,mid,right,然後在i的遍歷陣列的時候,剩下的操作思路和三數之和是一樣的。其中需要注意的是,因為求的是四個數字的和,所以left,mid,right分別就已經佔用了三個數,所以i只能遍歷到 nums.size()-3的前一個下標處。同理,在left遍歷的時候,只能遍歷到nums.size()-2的位置(因為剩下的兩個位置要留給mid,right)。
- 此時還是比較nums[mid]+nums[right]和tem的數值,那麼tem的數值根據:nums[left]+nums[mid]+nums[right]+nums[i]=target來推匯出,其中nums[right]+nums[mid]=target-nums[left]-nums[i].所以可以推出tem = target-nums[left]-nums[i]。然後再根據大小,來移動mid,right就可以了。
程式碼:
class Solution { public: void sort(vector<int>& nums) { int temp = 0; int len = nums.size(); for(int i=0; i<len; i++) { for(int j=i+1; j<len; j++) { if(nums[i] > nums[j]) { temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } } } vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums); int len = nums.size(); int i,left,mid,right; int tem,tem_i; vector <int>vi(4); vector<vector<int> > arry; for(i=0; i<(len-3); i++) { tem_i = target - nums[i]; if(i>0 && nums[i]==nums[i-1]) continue; for(left=i+1; left<len-2; left++) { tem = tem_i - nums[left]; mid = left+1; right = nums.size()-1; if(left>i+1 && nums[left]==nums[left-1]) continue; while(mid<right) { if(nums[mid]+nums[right] == tem) { int m = nums[mid]; int r = nums[right]; vi[0] = nums[i]; vi[1] = nums[left]; vi[2] = nums[mid]; vi[3] = nums[right]; arry.push_back(vi); while((mid<right) && (m==nums[++mid])) { continue; } while((mid<right) && (r==nums[--right])) { continue; } } else if(nums[mid]+nums[right]<tem) { mid++; } else{ right--; } } } } return arry; } };