首页 > 其他分享 >剑指offer81:允许重复选择元素的组合

剑指offer81:允许重复选择元素的组合

时间:2022-12-13 11:33:43浏览次数:41  
标签:target combination nums 重复 元素 offer81 组合 result 数字


题目:
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。
candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
1.输入: candidates = [2,3,6,7], target = 7
输出: [[7],[2,2,3]]
2.输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
3.输入: candidates = [1], target = 2
输出: [[1,1]]
分析:
该题和之前的79和80相比大同小异,最主要的不同点在于当选择将数组nums下标为i的数字添加到组合combination中之后,由于nums[i]这个数字可能在组合中重复出现,因此递归调用函数helper时第三个参数传入的指仍然是i,这个参数没有变化,下一步仍然处理数组nums的下标为i的数字。
该题target是组合combination中元素之和的目标值,每当在组合中添加一个数字时,就从target中减去这个数字,当target等于0的时候,组合中的所有元素之和正好等于target,因此也就找到一个符合条件的组合。
当使用回溯法解决问题时尽可能剪枝来优化时间效率,因为题目中明确指出数组中的所有数字都是正整数,因此当组合中已有数字和已经大于目标值的时候(target<0)就没必要考虑数组中还没有处理的数字,因此再在组合中添加任意正整数元素之后和会更大,一定找不到新的符合条件的组合。
代码:

import java.util.LinkedList;
import java.util.List;

public class CombinationSum {
public static void main(String[] args) {
CombinationSum combinationSum = new CombinationSum();
int[] nums = {2,3,5};
List<List<Integer>> lists = combinationSum.combinationSum(nums, 8);
System.out.println(lists);
}
public List<List<Integer>> combinationSum(int[] nums, int target) {
List<List<Integer>> result = new LinkedList<>();
LinkedList<Integer> combination = new LinkedList<>();
helper(nums,target,0,result,combination);
return result;
}

private void helper(int[] nums, int target, int i, List<List<Integer>> result, LinkedList<Integer> combination) {
if (target == 0){
result.add(new LinkedList<>(combination));
//target>0的作用是剪枝,减少不必要的递归,具体分析中有写。
}else if (target >0 && i < nums.length){
helper(nums,target,i+1,result,combination);
combination.add(nums[i]);
// 由于一个数字可以重复在组合中出现,也就是说下一步可能选择同一个数字,因此下一步仍然处理下标为i的数字。
helper(nums,target-nums[i],i,result,combination);
combination.removeLast();
}
}
}

剑指offer81:允许重复选择元素的组合_回溯


标签:target,combination,nums,重复,元素,offer81,组合,result,数字
From: https://blog.51cto.com/u_15911055/5933495

相关文章

  • 剑指offer84:包含重复元素集合的全排列
    题目:给定一个可包含重复数字的整数集合nums,按任意顺序返回它所有不重复的全排列。1.输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]2.输入:nums=[1,2,3]输出......
  • 剑指offer80:包含k个元素的组合
    **题目:**给定两个整数n和k,返回1…n中所有可能的k个数的组合。输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]输入:n=1,k=1输......
  • 分布式系统接口,如何避免表单的重复提交?
    关于怎么实现承载更多用户量的系统,一直是我重点关注的一个技术方向。改造架构提高承载力,通常来讲分为两个大方向,互相配合实现。硬件架构改进,主要是使用阿里云这种多组件的......
  • 计算一个数组中L位置到R位置的数组元素之和
    计算一个数组中L位置到R位置的数组元素之和解题思路一:我们很容易想到遍历数组,遍历数组L位置到R位置的元素并相机得到和代码:publicclassPreSum{ publicstaticcl......
  • Selenium12--元素基本操作
    文本框和文本域点击:click()清空:clear()输入:send_keys("数据")保留原内容,追加输入文本域输入换行时使用转义字符\n来表示获得属性值get_attribut......
  • 27. 移除元素
    27.移除元素力扣题目链接我的代码:左右指针交换,O(n)classSolution{publicintremoveElement(int[]nums,intval){if(nums.length==0){......
  • 力扣182(MySQL)-查找重复的电子邮箱(简单)
    题目:编写一个SQL查询,查找 Person 表中所有重复的电子邮箱。示例: 解题思路:方法一:使用groupby按Email来分组,然后使用having选择count(id)>1的就可以得到重复的Em......
  • 剑指offer 字符流中第一个不重复的字符(思维,队列)
    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“g......
  • 必备技能,MySQL 查找并删除重复行
    本文讲述如何查找数据库里重复的行。这是初学者十分普遍遇到的问题。方法也很简单。这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysqlIRC频道问到的问题)......
  • 第四章程序段的重复执行
    4.1for语句例4.1对于给定的任意正整数n,输出1~n的平方数。4.1.1for语句的格式与功能格式1for(循环变量初始化;循环条件;循环变量增量)语句格式2for(循环变量初始化;......