回溯类题目的常规思路—Leetcode-thinking_record07

目录

求子集(Medium)

Solve1:回溯法

总体思路

细节设计

Solve2:位运算法

预备知识

总体思路

细节设计

求子集Ⅱ

总体思路

细节设计

组合数之和Ⅱ(Medium)

总体思路

细节设计

生成括号(Medium)

预备知识:递归生成所有可能

总体思路

细节设计

N皇后(Hard)

预备知识:皇后的攻击范围

总体思路

细节设计

逆序数(Hard)

预备知识:分治算法之归并排序

总体思路

细节设计


回溯法又称为试探法,但当探索到某一步时,发现原先选择达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

求子集(Medium)

LeetCode 78.Subsets

已知一组数(其中无重复元素),求这组数可以组成的所有子集。结果中不可有无重复的子集。

例如:nums=[] = [1,2,3]

结果为: [[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]] 

Solve1:回溯法

总体思路

用回溯法来解此题,借用的就是回溯遍历的思想,应知如果把此题的遍历过程拆分成一步一步的可描述的步骤,那么最关键的就是如何进行选择放入还是不放入了。如下面的分析,当一个元素选择放入到集合中去,还是不放入到集合中去,所得到的了结果是不一样的。

细节设计

这里对应的第一次递归调用和第二次递归调用,就是对应的一个元素是放入到当前集合中去(item.push_back()之后再执行递归),还是不放入到当前集合中去的情况(item.pop_back()之后再执行递归)。 

 

Solve2:位运算法

预备知识

“&”运算,(二进制下)位元素都为1,结果为1,如果不同时为1,结果为0。

总体思路

细节设计

 

求子集Ⅱ

已知一组数(其中有重复元素),求这组数可以组成的所有子集。

结果中无重复的子集。

例如:nums[]=[2,1,2,2]

结果:[[],[1],[1,2],[1,2,2],[1,2,2,2],[2],[2,2],[2,2,2]]

注意:[2,1,2]与[1,2,2]是重合的集合!

总体思路

就是在计算之前先进行去重操作! 

细节设计

需要用到STL中的set集合了就!

组合数之和Ⅱ(Medium)

LeetCode 40 Combination SumⅡ

已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子集中的各个元素和为整数target的子集,结果中无重复的子集。

例如: nums[]=[10,1,2,7,6,1,5], target=8

结果为:[[1,7],[1,2,5],[2,6],[1,1,6]]

总体思路

细节设计

生成括号(Medium)

LeetCode 22. Generate Parentheses

已知n组括号,开发一个程序,生成这n组括号所有的合法的组合可能。

例如:n=3

结果为:["((()))","((),())","(()),()","(),(())","()()()"]

预备知识:递归生成所有可能

总体思路

细节设计

N皇后(Hard)

LeetCode 51 N-Queens

N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题。

将N个皇后摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆放方式具体是怎样的?

预备知识:皇后的攻击范围

总体思路

先以4皇后问题为例进行探讨:

细节设计

逆序数(Hard)

LeetCode 315. Count of Smaller Numbers After Self

已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比nums[i]的元素个数。

例如:

nums=[5,2,6,1],count=[2,1,1,0];

nums=[6,6,6,1,1,1],count=[3,3,3,0,0,0];

nums=[5,-7,9,1,3,5,-2,1],count=[5,0,5,1,2,2,0,0];

预备知识:分治算法之归并排序

总体思路

细节设计

发布了271 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_17846375/article/details/104716949