算法通关村-----回溯模板如何解决排列组合问题

2023-09-15 15:48:57

组合总和

问题描述

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。详见leetcode39

问题分析

我们可以从candidates[0]开始,不断选取candidates[0],直至target-candidates[0]<=0,如果等于0,则我们得到一个满足条件的组合,否则回退一步,去掉一个candidates[0],添加一个candidates[1],如此不断进行下去,满足局部枚举➕递归+放下前任,我门可以使用回溯模板来解决。

代码实现

public List<List<Integer>> combinationSum(int[] candidates, int target) {
    List<Integer> numList = new ArrayList<>();
    List<List<Integer>> resultList = new ArrayList();
    combinationSum(candidates,target,0,numList,resultList);
    return resultList;
}

public void combinationSum(int[] candidates, int target,int index,List<Integer> numList,List<List<Integer>> resultList){
    if(target<0){
        return;
    }
    if(target==0){
        resultList.add(new ArrayList<>(numList));
        return;
    }
    for(int i=index;i<candidates.length;i++){
        numList.add(candidates[i]);
        combinationSum(candidates,target-candidates[i],i,numList,resultList);
        numList.remove(numList.size()-1);
    }
}

全排列

问题描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

问题分析

排列与组合类似,只是重复元素可以按照不同顺序成为不同的排列,我们不再是按顺序的取,而是定义一个used数组判断给定数组的元素是否被使用。当我们的排列结果中的元素与给定数组个数相同时,即得到一个排列,添加到结果数组中。

代码实现

public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> ans = new LinkedList<>();
    boolean[] used = new boolean[nums.length];
    permute(res,ans,used,nums);
    return res;
}
public void permute(List<List<Integer>> res,LinkedList<Integer> ans,boolean[] used,int[] nums){
    if(ans.size()==nums.length){
        res.add(new ArrayList<>(ans));
        return;
    }
    for(int i=0;i<nums.length;i++){
        if(used[i]){
            continue;
        }
        used[i] = true;
        ans.add(nums[i]);
        permute(res,ans,used,nums);
        ans.removeLast();
        used[i] = false;
    }
}
更多推荐

参议院算法Java

Dota2的世界里有两个阵营:Radiant(天辉)和Dire(夜魇)Dota2参议院由来自两派的参议员组成。现在参议院希望对一个Dota2游戏里的改变作出决定,他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失

邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导

【问题描述】邓俊辉的《数据结构(C++语言版)(第3版)》(ISBN:9787302330646)中,开始于第48页的“2.6.5二分查找(版本A)”内容在第50页详述了“成功查找长度”的递推式,但此递推式乍一看令人费解。故为了说明问题,进行一些约定并详述如下:●既然是二分查找,所以给定的序列必定是有序的。●不失一般性

SmartNews 基于 Flink 的 Iceberg 实时数据湖实践

摘要:本文整理自SmartNews数据平台架构师ApacheIcebergContributor戢清雨,在FlinkForwardAsia2022实时湖仓专场的分享。本篇内容主要分为五个部分:SmartNews数据湖介绍基于Icebergv1格式的数据湖实践基于Flink实时更新的数据湖(Icebergv2)解决方案实

浅谈霍尔电流传感器在汽车电池管理系统中的应用

摘要:随着电动汽车和混合动力汽车的需求和产量正在增加,两种类型的车辆都需要高电流容量的电池来运行50kW或更高功率的电机,并且这些都使用高压系统。汽车电池管理系统中对于电流的测量检测需要隔离测量的方式,而霍尔电流传感器是隔离测量,所以霍尔电流传感器适用于该应用场景。关键词:电动汽车;混合动力汽车;电池管理系统;霍尔电流

Go语言基础-基础语法

前言:\textcolor{Green}{前言:}前言:💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营💞从这个专栏里面可以迅速获得Go的知识本文主要是根据今天所学(链接放在了最后)总结记录的笔记。主要内容包括学习准备(环境安装等)以及go语言的基础语法总结,其中有一些自己的想法,如果大家想与我交流共同进步

贝叶斯神经网络 BBB 学习中遇到的一些问题

这里写目录标题贝叶斯公式模型概率的公式1/n形式的贝叶斯公式全概率公式全概率公式的积分形式后验推理后验预测分布posteriorpredictivedistributionKL散度平均场VIBayesbyBackprop代码重新参数化贝叶斯公式模型概率的公式一开始看了这个https://zhuanlan.zhihu.c

AI创作专家,免费的AI创作专家工具

AI创作专家是一种崭新的工具,它们利用先进的人工智能技术,帮助创作者和写手更轻松地应对创作挑战。这些工具不仅可以生成文字,还可以提供灵感、帮助构思和组织思路,使创作过程更加高效。147GPT批量文章生成工具​www.147seo.com/post/2801.html​编辑https://link.zhihu.com/?

天猫商品详情数据采集

天猫商品详情数据采集方法有很多种,可以从商品详情页采集,也可以从PC端的ajax采集,也可以从开放平台的API采集。不同的来源有不同的数据结构,可以收集的信息也不同。天猫开放平台的API目前申请淘客API权限相对容易,淘客权限API能够收集到的信息非常少。如果从网页或者ajax采集,就要考虑采集的频率,容易触发反采集机

数学建模熵权法中信息熵与信息熵冗余度的理解

具体步骤:数学建模——熵权法-腾讯云开发者社区-腾讯云(tencent.com)灵感来源:信息熵越大,信息量到底是越大还是越小?-骚动的白米饭的回答-知乎https://www.zhihu.com/question/274997106/answer/1055696026信息熵在第二篇博文中有比较好的案例解读。我们在做A

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

前言本篇在讲什么调试Lua源码本篇需要什么对Lua语法有简单认知依赖VisualStudio工具本篇的特色具有全流程的图文教学重实践,轻理论,快速上手提供全流程的源码内容★提高阅读体验★👉♠一级标题👈👉♥二级标题👈👉♣三级标题👈👉♦四级标题👈目录♠前言♠新建C++控制台应用♠下载Lua源码♠引入Lua源

ChatGPT追祖寻宗:GPT-2论文要点解读

论文地址:LanguageModelsareUnsupervisedMultitaskLearners上篇:GPT-1论文要点解读在上篇:GPT-1论文要点解读中我们介绍了GPT1论文中的相关要点内容,其实自GPT模型诞生以来,其核心模型架构基本没有太大的改变,都是一路坚持奉行着基于Transformer的单解码器结构

热文推荐