← 返回目录

3. 分割(组合问题)

第 8 / 42 卷日期:

3. 分割(组合问题)

实质也是组合问题,切割的方式就是选择的起始位置

关键是截取子串是什么:s.substr(startIndex,i-startIndex+1);

4. 排序问题

需要使用标记数组,记录当前元素是否访问过,访问过设置为true:

vector<bool> used(candidates.size(),false);

组合排序通用问题、给定vector中可能包含重复的元素,要求不能出现重复的组合(即为树的树枝的节点可以重复,但是同一层不允许重复)

解决方法:

前提:需要先对数组升序【排序】,保证相同元素相邻,便于判断前后是否相等【关键】

  1. 定义标识数组 vector used(candidates.size(),false);
  2. 标识数组的含义:

used[i - 1] ==true:表示同一树枝使用过;

used[i - 1] == false,说明同一树层candidates[i - 1]使用过;

做选择时 used[i] =true 撤销选择时:used[i] = false;

  1. 判断一定是前一个元素,因为要和当前元素比较;
  2. 真正的去重代码: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. 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
  2. 2找出所有子集的异或总和再求和
  3. 3哈希表
  4. 4哈希冲突
  5. 5红黑树与AVL树
  6. 6平衡二叉树(AVL树)
  7. 7将有序数组转换为二叉搜索树
  8. 83. 分割(组合问题)
  9. 9方法论
  10. 10509. 斐波那契数
  11. 1162. 不同路径
  12. 1296. 不同的二叉搜索树
  13. 13322. 零钱兑换
  14. 14爬楼梯
  15. 15背包小总结 (01背包、完全背包)
  16. 16子序列问题
  17. 17674. 最长连续递增序列
  18. 18115. 不同的子序列
  19. 19总结
  20. 20技巧总结
  21. 21时间序列模型
  22. 22区间DP模型
  23. 23664. 奇怪的打印机
  24. 24编辑距离
  25. 25回文串
  26. 26DP递推公式总结
  27. 27排序算法
  28. 28其他算法
  29. 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
  30. 302. TOP N问题
  31. 313. 分布式的TOP N问题
  32. 322. Astar数据结构 + 公式
  33. 334. 代码实现
  34. 345. 总体代码
  35. 35堆排序
  36. 36单源最短路
  37. 37思维导图
  38. 38链表
  39. 39回溯
  40. 40贪心
  41. 41动态规划
  42. 42排序