1. 程式人生 > >陣列中求四數之和(三數之和的思路的基礎上)

陣列中求四數之和(三數之和的思路的基礎上)

題目:

思路:

  • 因為是求四個數字之和,所以將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; 
    }
};