day14:121. 买卖股票的最佳时机、56. 合并区间、135. 分发糖果
day14题目:121. 买卖股票的最佳时机、56. 合并区间、135. 分发糖果
学习计划链接:冲刺春招-精选笔面试 66 题大通关
今日知识点:数组、动态规划、排序等,难度为简单、中等、困难
昨日题目链接:冲刺春招-精选笔面试 66 题大通关 day13
给定一个数组 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]
比较二者取较大的一个数作为该孩子所需最少糖果数
代码
最后更新于