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号