p138 相加等于目标值的四个数(leetcode 18)

一:解题思路

Time:O(n^3),Space:O(1)

和之前做的 相加等于0的三个数 这道题目是一样的。

二:完整代码示例 (C++版和Java版)

C++:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> result;
        if (nums.size() < 4) return result;
        sort(nums.begin(),nums.end());

        for (int p = nums.size() - 1; p >= 3; p--)
        {
            if (4 * nums[p] < target) break;
            for (int k = p - 1; k >= 2; k--)
            {
                if (3 * nums[k] + nums[p] < target) break;
                int newTarget = target - (nums[p]+nums[k]);
                int i = 0, j = k - 1;

                while (i < j)
                {
                    if (nums[i] + nums[j] == newTarget)
                    {
                        vector<int> elem;
                        elem.push_back(nums[i]);
                        elem.push_back(nums[j]);
                        elem.push_back(nums[k]);
                        elem.push_back(nums[p]);
                        result.push_back(elem);

                        while (i < j && nums[i] == nums[i + 1]) i++;
                        while (i < j && nums[j] == nums[j - 1]) j--;
                        i++;
                        j--;
                    }
                    else if (nums[i] + nums[j] < newTarget) i++;
                    else j--;
                }

                while (k >= 2 && nums[k] == nums[k - 1]) k--;
            }

            while (p >= 3 && nums[p] == nums[p - 1]) p--;
        }

        return result;
    }
};

Java:

class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target)
        {
               List<List<Integer>> result=new ArrayList<>();
               if(nums==null || nums.length<4) return result;
               Arrays.sort(nums);
               for(int p=nums.length-1;p>=3;p--)
               {
                   if(4*nums[p]<target) break;
                   for(int k=p-1;k>=2;k--)
                   {
                       if(3*nums[k]+nums[p]<target) break;
                       int i=0,j=k-1;
                       int newTarget=target-(nums[k]+nums[p]);
                       while (i<j)
                       {
                           if(nums[i]+nums[j]==newTarget)
                           {
                               result.add(Arrays.asList(nums[i],nums[j],nums[k],nums[p]));
                               while (i<j && nums[i]==nums[i+1]) i++;
                               while (i<j && nums[j]==nums[j-1]) j--;
                               i++;
                               j--;
                           }
                           else if(nums[i]+nums[j]<newTarget) i++;
                           else j--;
                       }

                       while (k>=2 && nums[k]==nums[k-1]) k--;
                   }

                   while (p>=3 && nums[p]==nums[p-1]) p--;
               }

               return result;
        }
    }

 

posted @ 2020-04-16 20:03  repinkply  阅读(178)  评论(0)    收藏  举报