【代码随想录day 30】 力扣 763. 划分字母区间

视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5/?vd_source=a935eaede74a204ec74fd041b917810c

文档讲解:https://programmercarl.com/0763.划分字母区间.html#思路

力扣题目:https://leetcode.cn/problems/partition-labels/

这道题我也做出来了,但是思想很麻烦:

  1. 统计多少字母并且其起始位置
  2. 按起始顺序升序排列
  3. 找到第一个存在的数组开始遍历,如果和前一个有交集,upper取max。
  4. 如果没有交集,upper即为截断点,lower和upper更新。

但是卡哥的思想就很简洁,不用考虑起始位置,只需要考虑右边界的最大值即可,

  1. 每次遍历取最大值的右边界

  2. 如果i 遍历到了右边界就说明该截断了,这里很精妙***

  3. 存入截断值,更新left,right在每次更新数的时候会更新,所以不用更新

cpp 复制代码
class Solution {
public:

    vector<int> partitionLabels(string s) {
       int hash[27] = {0};
       vector<int> result;

       //遍历字符串统计最远值
       for(int i = 0; i < s.size(); ++i)
       {
            hash[s[i] - 'a'] = i;
       }

        //初始化左右边界
        int left = 0;
        int right = 0;
       for(int i = 0; i < s.size(); ++i)
       {
            //每次遍历取右边界最大值
            right = max(right, hash[s[i] - 'a']);

            //如果遍历到最大值时候说明该截断了
            if(i == right)
            {
                result.push_back(right - left + 1);
                left = i + 1;
                //right = hash[i];
            }
       }
       return result;
    }
};

这里是我的代码,虽然可以运行但是比较繁琐随便参考一下好了

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        // if(a[0] == b[0]);
        // 按起始位置升序排序
        return a[0] < b[0];
    }
    vector<int> partitionLabels(string s) {
        vector<vector<int>> index(26, vector<int>(2, -1));
        vector<int> result;
        // 遍历字符串s,统计其有什么字母以及字母的起始位置
        for (int i = 0; i < s.size(); ++i) {
            // 如果index中的第i个元素的起始位置为-1,说明还没有统计过这个字母的起始位置,将起始位置设为i
            if (index[s[i] - 'a'][0] == -1) {
                index[s[i] - 'a'][0] = i;
            }
            // 将该字符的终止位置更新为i
            index[s[i] - 'a'][1] = i;
        }
        // 将index按起始位置排序
        sort(index.begin(), index.end(), cmp);
        int start = 0;
        int lower;
        int upper;
        if (index[0][0] != -1) {
            lower = index[0][0];
            upper = index[0][1];
        }
        /*
        for(int i = 1; i < index.size(); ++i)
        {
            cout << index[i][0] << ' ' << index[i][1] << endl;
        }
        */
        for (int i = 1; i < index.size(); ++i) {
            // 如果找到第一个不是-1的数组
            if (index[i][0] != -1 && index[i - 1][0] == -1) {
                lower = index[i][0];
                upper = index[i][1];
            }
            // 如果该数组存在且起始位跟上一个有交集,扩大upper取max
            if (index[i][0] != -1 && index[i][0] < upper) {
                upper = max(upper, index[i][1]);
            }
            // 如果该数组起始位没有交集,存入切割点,更新lower和upper
            if (index[i][0] > upper) {
                result.push_back(upper - lower + 1);
                lower = index[i][0];
                upper = index[i][1];
            }
            if (i == index.size() - 1) {
                result.push_back(upper - lower + 1);
            }
        }

        return result;
    }
};
相关推荐
你撅嘴真丑2 小时前
第九章-数字三角形
算法
uesowys2 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder2 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮2 小时前
AI 视觉连载1:像素
算法
智驱力人工智能3 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥4 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风4 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風4 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT064 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠5 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法