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毫秒的最佳結果。
相關文章
- 18. 4Sum(Leetcode每日一題-2020.10.05)LeetCode每日一題
- 15+18、3Sum 4Sum
- 【Leetcode】18. 4Sum 給定陣列中的4個元素之和等於給定值的所有組合LeetCode陣列
- LeetCode T18LeetCode
- LeetCode18:四數之和LeetCode
- Leetcode[陣列] 18. 四數之和LeetCode陣列
- Q18 LeetCode206 翻轉列表LeetCode
- 001-ksum 求符合條件的 k 個數 1. Two Sum/15. 3Sum/18. 4Sum/
- LeetCode 刷題記錄(16、17、18)—Java語言LeetCodeJava
- 秒殺 2Sum 3Sum 4Sum 演算法題演算法
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- JDK 18:Java 18預覽 -infoworldJDKJava
- 5/18
- ‘3 18
- 【LeetCode】如何學習LeetCode?LeetCode
- vue18Vue
- 2024/4/18
- 2024/04/18
- 2024/3/18
- chapter18APT
- React18React
- Crypto(18)——CTFHub
- 18異常
- JDK18:Java18中的新特性 - infoworldJDKJava
- JDK 18 / Java 18 正式釋出:九項 JDK 增強JDKJava
- leetcodeLeetCode
- 5月18日
- 3月18日
- 2020-11-18
- 2020-10-18
- BootStrap筆記18boot筆記
- 18-具名插槽
- Oracle 18cOracle
- 18. 模組
- 10月18號
- 110月18日
- 9月18日
- NuxtI18nUX