题目合集
491 && 46 && 47 && 51 && 37
可再刷
做题思路总结
491.递增子序列
//难点1.答案所求递增子序列,故不可用排序先行处理
//难点2.集合和包含重复元素,如何对答案去重
//忽略点:答案需要收割所有节点
//解决思路:一般题直接用used数组去重,在这得需要set
//核心伪代码:
if(!path.empty()&&nums[i]<path.back()||set.find(nums[i])!=set.end())
continue;//第一部分不符合递增条件,第二部分是重复;那么跳过If这个条件才开始收割答案,递归回溯
46.全排列
//每层逻辑都从0开始,使用过的数用used数组记录
//收割的是叶子节点(最终答案)
//终止条件:收割大小==集合大小
47.全排列2(集合包含重复元素)
//核心思路:由于是全排列,所以集合中重复的元素排列情况必然一致,那么对集合进行排序,重复的直接continue
//判重逻辑:num[i]==num[i-1]&&used[i-1]==0
51.N皇后
//核心思路:对每一个位置尝试放皇后,判断是否合法,每层的逻辑必然得加一个判断的函数
//参数:N皇后每层的逻辑就是遍历“当前行的每一列”,所以棋盘的行数就是遍历的深度,棋盘的列数就是每层遍历的宽度,那么递归参数必须要有一个记录“当前行数”
backtracking(int n,int row,vector<string>&chessboard)
if(row==n) 收割答案
37.解数独
//核心思路:对每一个位置尝试填数字,判断是否合法,但是数字又是一个集合问题,需要遍历数字集合本身;所以先两次循环,确定好要填写的位置,单层的判断逻辑改成遍历数字集合
//难点:小9宫格的划分以及数字的判重逻辑