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

本题使用编程语言: Java