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代码
涵盖知识点:
- 数组排序
- 双指针
- 循环与条件判断
- 跳过重复元素
文字解释如下:
- 对数组 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 指针左移,以减小和的值。
- 将结果列表转换为二维数组,并返回满足条件的牛群组合列表。