day14:121. 买卖股票的最佳时机、56. 合并区间、135. 分发糖果
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
day14题目:、、
学习计划链接:
今日知识点:数组、动态规划、排序等,难度为简单、中等、困难
昨日题目链接:
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
示例 2:
提示:
1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
思路非常非常之清晰啊,因为本质上就是最小值与最大值的一个差让其最大化,且最大值必须在最小值之后出现,所以我们
用 minp
记录当前最小值,ans
记录最大利润
若当前 price[i] <= minp
,则更新 minp
否则,记录最大利润,ans = max(ans, prices[i]-minp)
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
示例 2:
提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
思路非常的清晰啊,因为要合并区间,所以需要先按照每个区间左端点大小升序排列(这样就可以每次与左边的合并即可)
排序 intervals.sort((a, b) => { return a[0] - b[0]; });
用 ans
存结果区间数组,以 k
记录 ans
当前下标
每次设 [prel, prer] = ans[k]
、[l, r] = intervals[i];
因为排过序了,所以 prel <= l
是必然成立的
只需要判断当前区间左端点 l
与上一个区间右端点 prer
之间关系
若 l > prer
则 无需合并,push
之后 ++k
,否则进行一个合并,更改区间右端点。
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1
个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
示例 2:
提示:
n == ratings.length
1 <= n <= 2 * 10^4
0 <= ratings[i] <= 2 * 10^4
由题意易知 每个孩子要跟左右两边个比较一次,那么我们从左往右扫一遍,然后再从右往左扫一遍取最大即可
从左往右,l[i]
存储 i
孩子与左边的比较后所需最少糖果数,若 ratings[i] > ratings[i-1]
则 l[i] = l[i-1]+1
,这里需要用数组暂存是因为接下来要跟右边比较
从右往左,r
记录 i
孩子与右边比较后所需最少糖果数,若 ratings[i] > ratings[i+1]
则 ++r
,否则 r = 1
,之后与 l[i]
比较二者取较大的一个数作为该孩子所需最少糖果数