贪心算法 常见的使用方法逻辑整理
1. 贪心算法 特点
贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用 贪心原则 ,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。
2. 贪心算法 通用方法
贪婪法的基本步骤:
- 步骤1:从某个初始解出发;
- 步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模;
- 步骤3:将所有解综合起来。
3. 常见面试题
一些总结
3.1 划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
- 划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
- 每个字母最多出现在一个片段中。
- 像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。
示例 2:
输入:s = “eccbbbbdec”
输出:[10]
解法
- 首先对字符串进行分割一定是从下标等于0的字符s1开始,找到最远的s1的下标index,循环0到index中的所有字符,找到这些字符的最远下标位置maxLength
- 如果maxLength大于index,则循环的边界要改为maxLength,直到0到max之间的字符都在这个片段之外不存在。
- 然后对字符串s进行subString截取,得到一个新的字符串,重复这一步骤,直到s变为空字符串
代码示例
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> list = new ArrayList<>();
while(!s.equals("")) {
String sub = s.substring