LeetCode刷题的一天(3)

举报
看,未来 发表于 2021/03/10 02:38:20 2021/03/10
【摘要】 文章目录 简单题·最后一个单词的长度题目思路代码实现 中等题·插入区间思路代码实现 困难题·分发糖果题目思路代码实现 很遗憾,今天早上的周赛看了一眼就没去了。 刷别的题目去了。 简单题·最后一个单词的长度 题目 给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回0。 ...

在这里插入图片描述

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

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

题目

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

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

示例 1:

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

  
 
  • 1
  • 2

示例 2:

输入:s = " "
输出:0

  
 
  • 1
  • 2

提示:

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

  
 
  • 1
  • 2

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


思路

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


代码实现

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

中等题·插入区间

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

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

示例 1:

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

  
 
  • 1
  • 2

示例 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] 重叠。

  
 
  • 1
  • 2
  • 3

示例 3:

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

  
 
  • 1
  • 2

示例 4:

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

  
 
  • 1
  • 2

示例 5:

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

  
 
  • 1
  • 2

提示:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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


思路

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


代码实现

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; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

困难题·分发糖果

题目

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

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

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

  
 
  • 1
  • 2

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

示例 1:

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

  
 
  • 1
  • 2
  • 3

示例 2:

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

  
 
  • 1
  • 2
  • 3
  • 4

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


思路

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

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

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

草图就不放啦,用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; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/candy/solution/fen-fa-tang-guo-by-leetcode-solution-f01p/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/114484892

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。