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; } }

浙公网安备 33010602011771号