算法题 |
算法刷题专栏 | 面试必备算法 | 面试高频算法
越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
作者简介:硕风和炜,CSDN-Java领域优质创作者,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享
恭喜你发现一枚宝藏博主,赶快收入囊中吧
人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?
算法题 |
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提示:
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
注意:相加结果可能会超过 32 位整数范围,需要用 64位整数存储四数之和
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> res=new ArrayList<>();
int n=nums.length;
for(int i=0;i<n-3;i++){
int x=nums[i];
if((long)x+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
if(i>0&&nums[i-1]==x) continue;
if((long)nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] < target) {
continue;
}
for(int j=i+1;j<n-2;j++){
int y=nums[j];
if((long)x+y+nums[j+1]+nums[j+2]>target) break;
if((long)nums[i] + nums[j] + nums[n - 2] + nums[n - 1] < target) {
continue;
}
if(j>i+1&&nums[j-1]==y) continue;
int left=j+1,right=n-1;
while(left<right){
long temp=(long)x+y+nums[left]+nums[right];
if(temp>target) right--;
else if(temp<target) left++;
else{
List<Integer> list=new ArrayList<>();
list.add(x);
list.add(y);
list.add(nums[left]);
list.add(nums[right]);
left++;
while(left<right && nums[left]==nums[left-1]) left++;
right--;
while(right>left && nums[right]==nums[right+1]) right--;
res.add(list);
}
}
}
}
return res;
}
}
时间复杂度&空间复杂度
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |