import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @param target int整型
     * @return int整型二维数组
     */
    public int[][] findThreeCows (int[] nums, int target) {
        // write code here
        List<int[]> result = new ArrayList<>();
        Arrays.sort(nums); // 首先对数组进行排序,以便后续查找

        for (int i = 0; i < nums.length - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue; // 跳过重复的数字,避免重复组合
            }

            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];

                if (sum == target) {
                    result.add(new int[] {nums[i], 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--;
                }
            }
        }

        return result.toArray(new int[result.size()][]);

    }
}

Java代码

涵盖知识点:

  1. 数组排序
  2. 双指针
  3. 循环与条件判断
  4. 跳过重复元素

文字解释如下:

  • 对数组 nums 进行排序,以便后续查找过程中可以跳过重复的数字。
  • 使用三个指针 i、left 和 right,其中 i 表示第一个牛的索引,left 和 right 分别表示第二个和第三个牛的索引。
  • 在循环中,遍历数组并计算三个牛的草料数量之和 sum。根据 sum 与 target 的比较,进行以下操作:如果 sum 等于 target,则将当前组合 [nums[i], nums[left], nums[right]] 添加到结果列表中。然后移动指针 left 和 right,并跳过重复元素,以避免重复组合。如果 sum 小于 target,则将 left 指针右移,以增加和的值。如果 sum 大于 target,则将 right 指针左移,以减小和的值。
  • 将结果列表转换为二维数组,并返回满足条件的牛群组合列表。