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)。

在循环中,首先判断当前元素是否与前一个元素相同,如果相同则跳过当前循环,避免重复计算。

使用两个指针leftright分别指向剩下的两个数的起始位置和结束位置。通过计算固定数、左指针和右指针所指元素的和,判断是否等于目标值。如果等于目标值,则将这四个数添加到result中,并移动左指针和右指针。如果和小于目标值,则将左指针向右移动一位。如果和大于目标值,则将右指针向左移动一位。

为了避免出现重复的四元组,需要在每个循环中跳过相同的元素。具体做法是,在固定数和左指针的循环中,如果当前元素与前一个元素相同,则直接跳过。在左指针和右指针移动时,如果移动后的元素与原来的元素相同,则继续移动指针,直到找到不相同的元素。

result转换成二维数组形式,并返回结果。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务