博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Backtracking思想解决subset/permutation/combination/partition问题
阅读量:7196 次
发布时间:2019-06-29

本文共 617 字,大约阅读时间需要 2 分钟。

这两天专门训练了backtracking类型的问题,包括N皇后、全排列全组合等等,我到现在也无法完全清晰描述recursive里的运行过程,但是多做了几道这种类型的题目之后发现还是很有套路的,即使思路不是很清晰也可以“凑”出代码。

recursive的代码有两点关键:1.出口条件 2.循环的写法

  1. 出口条件:出口条件还是挺容易,如全排列中list的长度为nums的length就把它加入到result list中,比如combination中sum等于target
  2. 循环的写法:

    1.全组合中为了避免重复组合的出现,每次取值都从下一个i开始

    for (int i = index; i < mums.length; i ++)

    全排列中每次都从首位开始取值,但是已经取过的元素不能再取

    for (int i = 0; i < mums.length; i ++)

    同时用一个visited数组来记录元素是否被访问过

    if (visited[I] == true) continue;

    2.如何处理有重复的情况?首先均需经过sort的预处理

    全组合去除重复组合的写法:

    if (i > index && nums[i] == nums[i-1]) continue;

    全排列去除重复组合的方法:

    if (i > 0 && nums[i] == nums[i-1] && visited[i-1] == false)  continue;

转载地址:http://xmzum.baihongyu.com/

你可能感兴趣的文章
BarTender表单的人性化设计—分组框
查看>>
在 CSS 中,width 和 height 指的是内容区域的宽度和高度
查看>>
河马SQLServer注入工具v1.1
查看>>
Linux基础知识随笔记
查看>>
Oracle:ORA-01791: 不是 SELECTed 表达式
查看>>
SpringMVC快速入门
查看>>
2019-05-20 Java学习日记之String类型
查看>>
.net core Jenkins持续集成Linux、Docker、K8S
查看>>
python入门
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Cisco ASA5512 双线
查看>>
杨元庆:税收影响联想电脑国内售价
查看>>
Linux虚拟机下lvm扩大根目录磁盘空间
查看>>
tomcat应用实践(虚拟主机以及站点优化)
查看>>
使用VB.NET重构简单知识简述
查看>>
访问网络共享
查看>>
xfreerdp的用法
查看>>
Redis有序集合数据类型操作命令
查看>>
iOS项目分层
查看>>