3. 分割(组合问题)
3. 分割(组合问题)
实质也是组合问题,切割的方式就是选择的起始位置
关键是截取子串是什么:s.substr(startIndex,i-startIndex+1);
4. 排序问题
需要使用标记数组,记录当前元素是否访问过,访问过设置为true:
vector<bool> used(candidates.size(),false);
组合排序通用问题、给定vector中可能包含重复的元素,要求不能出现重复的组合(即为树的树枝的节点可以重复,但是同一层不允许重复)
解决方法:
前提:需要先对数组升序【排序】,保证相同元素相邻,便于判断前后是否相等【关键】
- 定义标识数组 vector used(candidates.size(),false);
- 标识数组的含义:
used[i - 1] ==true:表示同一树枝使用过;
used[i - 1] == false,说明同一树层candidates[i - 1]使用过;
做选择时 used[i] =true 撤销选择时:used[i] = false;
- 判断一定是前一个元素,因为要和当前元素比较;
- 真正的去重代码:if(i>0&&candidates[i-1] == candidates[i] && used[i-1] ==false) continue;
贪心
构成交替字符串需要的最小交换次数
题目要求最小交换次数,那么对于不同的串,0 1 的出现次数也不相同,根据字符串的长度可分为偶数和奇数先求出 num1, num0,odd1,odd0
首先特判,num1 和 num0 两者个数相差不能大于 1,否则返回 -1
对于偶数长度,有两种情况,1010...,0101...
1 开头,那么奇数位置都应该为 1,那么奇数位置为 0 的次数(odd0) 就是要交换的次数 0 开头,那么奇数位置都应该为 0,那么奇数位置为 1 的次数(odd1) 就是要交换的次数
要求最小交换次数,返回两者中的最小值
对于奇数长度,有两种情况,010...,101....
由于是只有奇数个,所以 1 开头的话,必然是 num1 > num0,要交换的次数也就是odd0,反之,0开头,必然num0 > num1,返回odd1
动态规划
全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序