Java 题解 | #牛群的标签和#
牛群的标签和
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<>(); if (nums == null || nums.length < 4) { return new int[0][]; } 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[][] res = new int[result.size()][4]; for (int i = 0; i < result.size(); i++) { for (int j = 0; j < 4; j++) { res[i][j] = result.get(i).get(j); } } return res; } }
Java代码。
该题考察的知识点是双指针法和数组处理。
对输入数组进行排序,以便使用双指针法查找四元组。
使用两个嵌套的循环来固定前两个数。外层循环从数组的第一个元素遍历到倒数第四个元素(i < nums.length - 3
)。内层循环从外层循环的下一个元素开始遍历到倒数第三个元素(j = i + 1; j < nums.length - 2
)。
在循环中,首先判断当前元素是否与前一个元素相同,如果相同则跳过当前循环,避免重复计算。
使用两个指针left
和right
分别指向剩下的两个数的起始位置和结束位置。通过计算固定数、左指针和右指针所指元素的和,判断是否等于目标值。如果等于目标值,则将这四个数添加到result
中,并移动左指针和右指针。如果和小于目标值,则将左指针向右移动一位。如果和大于目标值,则将右指针向左移动一位。
为了避免出现重复的四元组,需要在每个循环中跳过相同的元素。具体做法是,在固定数和左指针的循环中,如果当前元素与前一个元素相同,则直接跳过。在左指针和右指针移动时,如果移动后的元素与原来的元素相同,则继续移动指针,直到找到不相同的元素。
将result
转换成二维数组形式,并返回结果。