题解 | #牛群的标签和#
牛群的标签和
https://www.nowcoder.com/practice/42ae88bedeb74da99813f6150769d07e
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型二维数组 */ public int[][] fourSum (int[] nums, int target) { // write code here List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); 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; // 跳过重复元素 } int left = j + 1; int right = nums.length - 1; while (left < right) { int sum = nums[i] + nums[j] + nums[left] + nums[right]; if (sum == target) { result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); while (left < right && nums[left] == nums[left + 1]) left++; while (left < right && nums[right] == nums[right - 1]) right--; left++; right--; } else if (sum < target) { left++; } else { right--; } } } } int[][] output = new int[result.size()][4]; for (int i = 0; i < result.size(); i++) { output[i] = new int[] {result.get(i).get(0), result.get(i).get(1), result.get(i).get(2), result.get(i).get(3)}; } return output; } }
Java代码
这个问题涉及以下知识点
- 数组操作
- 双指针法
- 去重
- 二维数组
代码的文字解释如下:
- fourSum 方法接受一个整数数组 nums 和目标值 target 作为输入。
- 对数组 nums 进行排序,以便进行双指针法处理。
- 使用两层嵌套循环遍历数组,其中外层循环 i 和内层循环 j 用于固定前两个元素。
- 在内层循环中,使用双指针 left 和 right 在剩余部分查找满足条件的后两个元素。
- 如果找到满足条件的四元组,将其添加到 result 列表中,但同时需要跳过重复元素。
- 将 result 列表中的四元组转换为二维数组 output,以满足函数的返回类型要求。