力扣刷题记录(14)LeetCode:763、56、738

目录

763.划分字母区间

56.合并区间

 738.单调递增的数字

总结


763.划分字母区间

力扣刷题记录(14)LeetCode:763、56、738_第1张图片

这道题的关键点在于想到使用一个数组去存放每个字母在字符串中的最大索引。之后我们在遍历字符串的时候就知道应该在什么地方停止,想要得到最大分割次数,就应该在当前索引等于遍历过的字母在字符串中的最大索引时划分。

class Solution {
public:
    vector partitionLabels(string s) {
        int last[26]={0};
        for(int i=0;i ans;
        int maxPositiion=0,sum=0;
        for(int i=0;i

56.合并区间

力扣刷题记录(14)LeetCode:763、56、738_第2张图片 

如果刷了几篇文章的题目,那这道题就比较简单了。直接来个按照区间左值大小的方式排序。然后根据当前区间的左值和上一个区间的右值来判断两区间是否重叠,重叠就合并,不重叠就将上一个区间插入到ans中。

class Solution {
public:
    static bool cmp(const vector& a,const vector& b)
    {
        if(a[0]==b[0])  return a[1]> merge(vector>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        vector> ans;
        vector v=intervals[0];
        for(int i=1;i

 738.单调递增的数字

力扣刷题记录(14)LeetCode:763、56、738_第3张图片

这道题可以先将其转换成字符串,方便判断每个数字的大小。对字符串从后向前遍历,如果遇到前一个值大于当前值的情况,我们就把前一个值减1,把当前值及当前值以后的值全部变成9。这样即可得到最大递增数字。

 

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        //转成字符串
        string s=to_string(n);
        if(s.size()==1) return n;
        for(int i=s.size()-1;i>0;i--)
        {
            if(s[i-1]>s[i])
            {
                s[i-1]--;
                for(int j=i;j

总结

贪心算法可以解决两类问题,一类是寻找最大值问题(跳跃游戏、买股票的最佳时机、最大子序列和等),另一类是区间问题(引爆气球、无重叠区间、合并区间等)。其实寻找最大值也是在一段区间中寻找,归根结底还是区间问题。只不过一些问题是在区间里面寻找最大值,一些问题是判断区间是否重叠。

 

你可能感兴趣的:(leetcode,算法,数据结构,c++)