Leetcode 18 4Sum
Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
such that a + b + c + d = target
? Find all unique quadruplets in the array which gives the sum of target
.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0. A solution set is: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
這個題跟前面的3Sum,3Sum closest很相似,這次採用了set去重,可以直接遍歷,也可以設定雙指標。
1)
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
Arrays.sort(nums);
int len = nums.length;
Set<List> set = new HashSet<>();
for(int i = 0 ; i < len - 3 ; i++){
for(int j = i + 1 ; j < len - 2 ;j++){
int left = j + 1;
int right = len - 1;
while(left < right){
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if(sum == target){
List<Integer> li = new ArrayList<>();
li.add(nums[i]);
li.add(nums[j]);
li.add(nums[left]);
li.add(nums[right]);
if(!set.contains(li)){
set.add(li);
list.add(li);
}
--right;
++left;
}else if(sum > target){
right--;
}else{
left++;
}
}
}
}
return list;
}
}
51ms
2)
class Solution {
public List<List<Integer>> fourSum(int[] num, int target) {
ArrayList<List<Integer>> ans = new ArrayList<>();
if(num.length < 4)
return ans;
Arrays.sort(num);
for(int i=0; i<num.length-3; i++){
if(num[i] + num[i+1] + num[i+2] + num[i+3] > target)
break; //first candidate too large, search finished
if(num[i] + num[num.length-1] + num[num.length-2] + num[num.length-3] < target)
continue; //first candidate too small
if(i > 0 && num[i] == num[i-1])
continue; //prevents duplicate result in ans list
for(int j=i+1; j<num.length-2; j++){
if(num[i] + num[j] + num[j+1] + num[j+2] > target)
break; //second candidate too large
if(num[i] + num[j] + num[num.length-1] + num[num.length-2] < target)
continue; //second candidate too small
if(j>i+1 && num[j]==num[j-1])
continue; //prevents duplicate results in ans list
int low=j+1, high=num.length-1;
while(low < high){
int sum=num[i] + num[j] + num[low] + num[high];
if(sum == target){
ans.add(Arrays.asList(num[i], num[j], num[low], num[high]));
while(low<high && num[low]==num[low+1])
low++; //skipping over duplicate on low
while(low<high && num[high]==num[high-1])
high--; //skipping over duplicate on high
low++;
high--;
}
//move window
else if(sum < target)
low++;
else
high--;
}
}
}
return ans;
}
}
//14毫秒的最佳結果。
相關文章
- Leetcode 4SumLeetCode
- [LeetCode] 4Sum 四數之和LeetCode
- 18. 4Sum(Leetcode每日一題-2020.10.05)LeetCode每日一題
- 【Leetcode】18. 4Sum 給定陣列中的4個元素之和等於給定值的所有組合LeetCode陣列
- 演算法4Sum演算法
- LeetCode T18LeetCode
- LeetCode18:四數之和LeetCode
- LeetCode 182. Duplicate EmailsLeetCodeAI
- LeetCode 189 旋轉陣列LeetCode陣列
- [LeetCode] 518. Coin Change 2LeetCode
- LeetCode-189-旋轉陣列LeetCode陣列
- 【LeetCode】189. 旋轉陣列LeetCode陣列
- Leetcode[陣列] 18. 四數之和LeetCode陣列
- 秒殺 2Sum 3Sum 4Sum 演算法題演算法
- LeetCode-187-重複的DNA序列LeetCode
- LeetCode 118. 楊輝三角LeetCode
- LeetCode 184. Department Highest SalaryLeetCode
- 前端工程師的 LeetCode 之旅 -- 周賽 182前端工程師LeetCode
- LeetCode(188) Best Time to Buy and Sell Stock IV (Java)LeetCodeJava
- LeetCode 188 買賣股票的最佳時機IV HERODING的LeetCode之路LeetCode
- LeetCode每日一題: 旋轉陣列(No.189)LeetCode每日一題陣列
- LeetCode 刷題記錄(16、17、18)—Java語言LeetCodeJava
- leetCode(Using C)——718. Maximum Length of Repeated SubarrayLeetCode
- 【LeetCode從零單排】No189 .Rotate ArrayLeetCode
- Q18 LeetCode206 翻轉列表LeetCode
- LeetCode每日一題: 楊輝三角(No.118)LeetCode每日一題
- [LeetCode] 3184. Count Pairs That Form a Complete Day ILeetCodeAIORM
- 【Leetcode】1180. Count Substrings with Only One Distinct LetterLeetCode
- 【LeetCode從零單排】No118 Pascal's TriangleLeetCode
- leetcode面試經典150題- 189. 輪轉陣列LeetCode面試陣列
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- 力扣 (LeetCode) - Database-刷題183--從不訂購的客戶力扣LeetCodeDatabase
- 每天一道LeetCode--118. Pascal's Triangle(楊輝三角)LeetCode
- LeetCode 1812[判斷國際象棋棋盤中一個格子的顏色]LeetCode
- 【LeetCode】如何學習LeetCode?LeetCode
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- LeetcodeLeetCode
- LeetCode in actionLeetCode