【LeetCode】HOT 100(20)

题单介绍:

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。

目录

题单介绍:

题目:621. 任务调度器 - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过过过过啦!!!!

题目:581. 最短无序连续子数组 - 力扣(Leetcode)

题目的接口:

解题思路:

扫描二维码关注公众号,回复: 15635794 查看本文章

代码:

过过过过啦!!!!

写在最后:


题目:621. 任务调度器 - 力扣(Leetcode)

题目的接口:

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) { 

    }
};

解题思路:

这道题的思路是这样的:

通过一个26大的数组存储任务数量(因为任务只有A~Z)

通过排序找到最大的任务数量

求出至少有多长:A->X->X->A->X->X->A

求最后一个任务还带着几个任务:A->X->X->A->X->X->A->?

如果任务的数量超过了间隔的数量,就直接返回任务数量:例:

比如说,有两个间隔,但是一个又四种任务,那任务又得全部做完,

那直接返回任务的数量就行了。

代码如下:

代码:

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) { 
        //如果间隔是0,或者只有一个(零个)任务,就直接返回
        if(tasks.size() <= 1 || n < 1) return tasks.size();

        //通过一个26大的数组存储任务数量(因为任务只有A~Z)
        vector<int> v(26, 0);
        for(int i = 0; i < tasks.size(); i++) {
            v[tasks[i] - 'A']++;
        }

        //通过排序找到最大的任务数量
        sort(v.begin(), v.end());
        int maxCnt = v[25];
        //求出至少有多长:A->X->X->A->X->X->A
        int maxVal = (maxCnt - 1) * (n + 1) + 1; 

        //求最后一个任务还带着几个任务:A->X->X->A->X->X->A->?
        int i = 24;
        while(i >= 0 && v[i] == maxCnt) {
            i--;
            maxVal++;
        }

        //如果任务的数量超过了间隔的数量,就直接返回任务数量
        return max(maxVal, (int)tasks.size());
    }
};

过过过过啦!!!!

题目:581. 最短无序连续子数组 - 力扣(Leetcode)

题目的接口:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {

    }
};

解题思路:

这道题我使用的就是O(N)的算法,

其实就是用双指针,

一个找右边界,一个找左边界,

具体思路是这样的:

1. 用来找右边界的指针从左往右走,记录遇到的最大值,

一直往右走遇到的最后一个最大值的前一个位置就是右边界;

2. 用来找左边界的指针从右往左走,记录遇到的最小值,

一直往左走遇到的最后一个最小值的前一个位置就是左边界。

代码如下:

代码:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int n = nums.size();
        int rMax = INT_MIN, right = -1;
        int lMax = INT_MAX, left = -1;
        for(int i = 0; i < n; i++) {
            if(rMax > nums[i]) {
                right = i;
            }
            else {
                rMax = nums[i];
            }
            if(lMax < nums[n - i - 1]) {
                left = n - i - 1;
            }
            else {
                lMax = nums[n - i - 1];
            }
        }
        return right == -1 ? 0 : right - left + 1;
    }
};

过过过过啦!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

猜你喜欢

转载自blog.csdn.net/Locky136/article/details/131300237