- 77. 组合(Done)">77. 组合(Done)
- 46. 全排列(Done)">46. 全排列(Done)
- 47. 全排列 II(不熟练)">47. 全排列 II(不熟练)
- 31. 下一个排列(Done)">31. 下一个排列(Done)
">- 267. 回文排列 II">267. 回文排列 II
下一个排列
- 多背多练。
组合
- 记得枝剪提升效率
全排列II
- 如何去重 -> 排序 + 保存一个vis的boolean数组
- if (i > 0 && nums[i] == nums[i-1] && !vis[i-1]) continue
- 原理
- 限制出现顺序,比如说a1 a2 a3,就只会按照a1 a2 a3的顺序出现
- 同一层的去重,如果vis[i-1]=false,表示 nums[i]和nums[i-1]在同一层的递归里面,也就是index相同,所以要去重。
77. 组合(Done)
答案
-
46. 全排列(Done)
答案
回溯+保留一个全局变量数组来控制每个位置可以选择的数字
- index之前的是已经用掉的数字,后面的(包括index)是可以选择的范围,这个数组的顺序会根据每一步选择的元素发生变动
47. 全排列 II(不熟练)
重复数字如何处理重复解
官方答案看不懂。。。,用我自己的
答案:
- index之前的是已经用掉的数字,后面的(包括index)是可以选择的范围,这个数组的顺序会根据每一步选择的元素发生变动
hashmap统计频次+根据剩余频次来判断剩下那些元素可以选择
-
31. 下一个排列(Done)
直接背答案
答案:
五步走:
1. 从后往前找到第一个单调递减的值x记录index为i
2. 从后往前找到第一个大于x的值y
3. 交换x和y
4. 翻转i之后的元素来进行升序排列(不包括i)
5. 记得处理从后往前全升序情况267. 回文排列 II
我自己做的超时了,测试用例18/26
答案: 第一步判断是否可以构成回文串
- 第二步,只回溯枚举前一半的回文串,节约时间。