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.注意判断集合是否为空,代表是否成功找到,没找到的话,返回空数组