import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param target int整型
* @return int整型二维数组
*/
public int[][] fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0 && nums[i] > target) {
int numRows = result.size();
int numCols = result.get(0).size(); // 假设所有子列表的长度相同
int[][] resultArray = new int[numRows][numCols];
for (int k = 0; k < numRows; k++) {
for (int j = 0; j < numCols; j++) {
resultArray[k][j] = result.get(k).get(j);
}
}
return resultArray;
}
// 对i 进行去重
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
for (int j = i + 1; j < nums.length; j++) {
// 对j进行去重
if (j > i + 1 && nums[j] == nums[j - 1]) {
continue;
}
int left = j + 1;
int right = nums.length - 1;
while (left < right) {
long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
// 对right进行去重
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
// 对left进行去重
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
left++;
right--;
}
}
}
}
if(result.isEmpty()){
return new int[0][0];
}
int numRows = result.size();
int numCols = result.get(0).size(); // 假设所有子列表的长度相同
int[][] resultArray = new int[numRows][numCols];
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
resultArray[i][j] = result.get(i).get(j);
}
}
return resultArray;
}
}
本题知识点分析:
1.双指针
2.数组遍历
3.集合转数组
4.集合存取
5.数学模拟去重
本题解题思路分析:
1.本题就是四数之和,三数之和升级版
2.同理,先进行排序
3.三数之和时间复杂度可以O(N),四数之和由于两个for需要O(N2)
4.分别对i和j进行去重
5.然后利用双指针的二分查找
6.如果找到target==sum,那么就添加到集合
7.集合转二维数组
8.注意判断集合是否为空,代表是否成功找到,没找到的话,返回空数组

京公网安备 11010502036488号