LeetCode刷题的一天(3)

155 阅读4分钟

在这里插入图片描述

文章目录

很遗憾,今天早上的周赛看了一眼就没去了。
刷别的题目去了。

简单题·最后一个单词的长度

题目

给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回0。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:

输入:s = "Hello World"
输出:5

示例 2:

输入:s = " "
输出:0

提示:

1 <= s.length <= 104
s 仅有英文字母和空格 ' ' 组成

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/le…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

思路其实没什么难的,就找空格嘛。不过要注意可能最后几个字符会全是空格,需要仔细甄别就好了。


代码实现

int lengthOfLastWord(string s) {
        int sz = s.size();

        if (sz == 0) {
            return NULL;
        }

        int flag = 0, keep_flag = 0;

        for (int i = 0; i < sz; i++) {
            if (s[i] == ' ') {
                if(flag > 0 )
                    keep_flag = flag;
                flag = 0;
                continue;
            }
            flag++;
        }

        if (flag == 0)
            return keep_flag;
        return flag;
    }

中等题·插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

示例 3:

输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

示例 4:

输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]

示例 5:

输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

提示:

0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 10^5
intervals 根据 intervals[i][0] 按 升序 排列
newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 10^5

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/in…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

那这不也很直接吗?并没有什么弯弯绕的。


代码实现

vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        int left = newInterval[0];
        int right = newInterval[1];
        bool placed = false;
        vector<vector<int>> ans;
        for (const auto& interval: intervals) {
            if (interval[0] > right) {
                // 在插入区间的右侧且无交集
                if (!placed) {
                    ans.push_back({left, right});
                    placed = true;                    
                }
                ans.push_back(interval);
            }
            else if (interval[1] < left) {
                // 在插入区间的左侧且无交集
                ans.push_back(interval);
            }
            else {
                // 与插入区间有交集,计算它们的并集
                left = min(left, interval[0]);
                right = max(right, interval[1]);
            }
        }
        if (!placed) {
            ans.push_back({left, right});
        }
        return ans;
    }

困难题·分发糖果

题目

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。

你需要按照以下要求,帮助老师给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。

那么这样下来,老师至少需要准备多少颗糖果呢?

示例 1:

输入:[1,0,2]
输出:5
解释:你可以分别给这三个孩子分发 212 颗糖果。

示例 2:

输入:[1,2,2]
输出:4
解释:你可以分别给这三个孩子分发 121 颗糖果。
     第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ca…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

这个题啊,就没有那么好想了。
刚开始我的想法是类似于“接雨水”那倒题的思维,层序递减。算了一下时间复杂度,不合算。

休息了一会儿,还是画了画草图。发现可以从头遍历,记住每个转折点,对比转折点前后的高度,进行比对。
但是实现起来还是比较繁琐的。

突然,灵机一动,这不就是在一个序列中不断寻找上升序列和下降序列的过程嘛。但是因为有“持平”序列的干扰,导致计数并没有那么好计。
那好办呐,那头尾先不计嘛。等着一上一下解决之后,在计算上下之间夹着的波峰/波谷的值不就好了嘛。

草图就不放啦,用LeetCode上的图吧,看的比较容易懂,我那儿就画了一条波浪线,比较。。
在这里插入图片描述

如果光看这张图,容易以偏概全,还是要在纸上自己画条波浪线,把细节部分敲定清楚了。


代码实现

我的代码太冗余,还是用LeetCode的轻装代码吧。

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        int ret = 1;
        int inc = 1, dec = 0, pre = 1;
        for (int i = 1; i < n; i++) {
            if (ratings[i] >= ratings[i - 1]) {
                dec = 0;
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
                ret += pre;
                inc = pre;
            } else {
                dec++;
                if (dec == inc) {
                    dec++;
                }
                ret += dec;
                pre = 1;
            }
        }
        return ret;
    }
};

作者:LeetCode-Solution
链接:leetcode-cn.com/problems/ca…
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。