建一个网站流程,无代码开发,wordpress rss 订阅,网站的公告轮播效果怎么做文章目录 题目描述解题方法排序 双指针java代码 相似题目 题目描述
给你一个由 n 个整数组成的数组 nums #xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] #xff08;若两个四元组元素一一对应 双指针java代码 相似题目 题目描述
给你一个由 n 个整数组成的数组 nums 和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] 若两个四元组元素一一对应则认为两个四元组重复
0 a, b, c, d na、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
解题方法
排序 双指针
本题的解题思路和三数之和相似。将数组按照从小到大排序后最外层和第二层采用单指针从起始位置开始遍历最内层采用左指针和右指针根据四数之和的大小不断向中间位置靠拢。具体细节就不过多赘述了没看过三数之和的童鞋可以先去看三数之和和最接近的三数之和。
需要注意的是题目中的数字之和可能会超过整型范围所以存储的数字之和类型为长整型。
java代码
public ListListInteger fourSum(int[] nums, int target) {Arrays.sort(nums);ListListInteger list new ArrayList();for (int i 0; i nums.length - 3; i) {// 与上一个数字相等跳过本次循环if (i 0 nums[i] nums[i - 1]) {continue;}for (int j i 1; j nums.length - 2; j) {// 与上一个数字相等跳过本次循环if (j i 1 nums[j] nums[j - 1]) {continue;}long num1 nums[i] nums[j];int l j 1;int r nums.length - 1;while (l r) {// 化为长整型存储数字之和long totalSum num1 (long) nums[l] (long) nums[r];if (totalSum (long) target) {// 与上一个数字相等跳过本次循环while (l r nums[l 1] nums[l]) {l;}l;} else if (totalSum (long) target) {// 与上一个数字相等跳过本次循环while (l r nums[r - 1] nums[r]) {r--;}r--;} else {ListInteger list1 new ArrayList();list1.add(nums[i]);list1.add(nums[j]);list1.add(nums[l]);list1.add(nums[r]);list.add(list1);// 与上一个数字相等跳过本次循环while (l r nums[l 1] nums[l]) {l;}// 与上一个数字相等跳过本次循环while (l r nums[r - 1] nums[r]) {r--;}l;r--;}}}}return list;
}时间复杂度 O ( N 3 ) O(N^3) O(N3) N N N为 n u m s nums nums数组长度。 空间复杂度 O ( 1 ) O(1) O(1)。
相似题目
[leetcode] 1. 两数相加 [leetcode] 15. 三数之和 [leetcode] 16. 最接近的三数之和 个人公众号 个人小游戏