题解 | #牛群喂食#
牛群喂食
https://www.nowcoder.com/practice/591c222d73914c1ba031a660db2ef73f
知识点
回溯
解题思路
题目的题意是,要找出 candidates 中可以使食物总量和为目标数 target 的所有不同组合,我们可以使用回溯算法。
回溯算法通过不断尝试不同的选择,然后回溯到上一步进行下一个选择,来找到所有可能的组合。
Java题解
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param candidates int整型一维数组 * @param target int整型 * @return int整型二维数组 */ public int[][] cowCombinationSum(int[] candidates, int target) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(candidates); backtrack(result, new ArrayList<>(), candidates, target, 0); return convertListToArray(result); } private void backtrack(List<List<Integer>> result, List<Integer> combination, int[] candidates, int target, int start) { if (target == 0) { result.add(new ArrayList<>(combination)); return; } for (int i = start; i < candidates.length; i++) { int num = candidates[i]; if (target - num < 0) { break; // 因为数组已经排序,后续的数字肯定会更大,所以直接结束循环 } combination.add(num); backtrack(result, combination, candidates, target - num, i); // 可以重复选择当前数字,所以传入的参数仍然是 i combination.remove(combination.size() - 1); } } private int[][] convertListToArray(List<List<Integer>> result) { int[][] array = new int[result.size()][]; for (int i = 0; i < result.size(); i++) { List<Integer> list = result.get(i); int[] arr = new int[list.size()]; for (int j = 0; j < list.size(); j++) { arr[j] = list.get(j); } array[i] = arr; } return array; } }