贪心算法
分发饼干
大饼干优先给大胃口的学生,遍历学生,满足条件后再更新饼干
摆动序列
多种情况,记录上一个对差值,遇到平坡不更新差值,只在变化时更新差值(last带等号,now不带等号)
最大子序和
当当前值为负数的时候,放弃掉当前值,重新开始,因为负数加上任意一个数都会更小
int result = INT32_MIN;表示32位有符号整数的最小值
买股票的最佳时机II
只计算上升段的和
写法优化:大于0,+=value:+=max(value,0);
1 | result += max(prices[i] - prices[i - 1], 0); |
跳跃游戏
最大覆盖值,一直更新for循环的限制值,只在限制值范围内循环,找到答案提前return
跳跃游戏II(重做没思路)
在当前覆盖范围内,找最大的跳跃距离
K次取反后最大化数组和
先尽量吧负数全变成正数,再针对最小的数疯狂取反
代码优化:
cmp排序:
1 | static bool cmp(int a, int b) { |
判断单双:
if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步
简单求和:
1 | for (int a : A) result += a; |
加油站
两种解法
第一种:相减之后当最大子序和来做,自序和为负数肯定不是起点
第二种:看累加最小值,从后往前数,看什么时候能把这个负数填平
int min = INT_MAX;
分发糖果
双纬度排序
柠檬水找零
先把面额大的钱花出去
代码优化
1 | //对于key种类少的哈希表,可以用 |
根据身高重建队列
主要是cmp排序
1 | static bool cmp(const vector<int>& a,const vector<int>& b) |
vector插入
1 | result.insert(result.begin()+people[i][1],cur); |
vector原理讲解,回头再看,与list的对比
用最少数量的箭引爆气球
排序,属于区间类问题
无重叠区间(可以再做一遍,注意思路)
划分字母区间
字母操作,’b’-‘a’是ascii码相减
这道题抽象成司机乘客上车的例子
哈希表的字母构造方式,以及排序计算
1 | int hash[26]; |
注意计算字符串长度的方法
当一个字符串结束时,接下来从下一个索引作为下一个字符串的开始
以i-left+1的方式计算长度,以left = i+1的方式更新,注意数值先于判断更新,left最后更新
合并区间
用result.back()来获取结果数组的最后一项,从而拿来对比下一个,创建下一个结果
单调递增的数字
这题看似简单但是新知识点挺多
1 | //整数转字符串 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.


