分发饼干

大饼干优先给大胃口的学生,遍历学生,满足条件后再更新饼干

摆动序列

多种情况,记录上一个对差值,遇到平坡不更新差值,只在变化时更新差值(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
2
3
4
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
sort(A.begin(), A.end(), cmp);

判断单双:
if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步
简单求和:

1
for (int a : A) result += a; 

加油站

两种解法
第一种:相减之后当最大子序和来做,自序和为负数肯定不是起点
第二种:看累加最小值,从后往前数,看什么时候能把这个负数填平
int min = INT_MAX;

分发糖果

双纬度排序

柠檬水找零

先把面额大的钱花出去

代码优化

1
2
3
4
5
6
7
//对于key种类少的哈希表,可以用
int five = 0, ten = 0, twenty = 0;c
//来代替
map<int,int>moneyset;
moneyset.insert({5,0});
moneyset.insert({10,0});
moneyset.insert({20,0});

根据身高重建队列

主要是cmp排序

1
2
3
4
5
static bool cmp(const vector<int>& a,const vector<int>& b)
{
if(a[0]==b[0])return a[1]<b[1];
return a[0]>b[0];
}

vector插入

1
result.insert(result.begin()+people[i][1],cur);

vector原理讲解,回头再看,与list的对比

用最少数量的箭引爆气球

排序,属于区间类问题

无重叠区间(可以再做一遍,注意思路)

划分字母区间

字母操作,’b’-‘a’是ascii码相减

这道题抽象成司机乘客上车的例子

哈希表的字母构造方式,以及排序计算

1
2
3
4
5
int hash[26];
for(int i=0;i<s.size();i++)
{
hash[s[i]-'a']=i;
}

注意计算字符串长度的方法

当一个字符串结束时,接下来从下一个索引作为下一个字符串的开始

以i-left+1的方式计算长度,以left = i+1的方式更新,注意数值先于判断更新,left最后更新

合并区间

用result.back()来获取结果数组的最后一项,从而拿来对比下一个,创建下一个结果

单调递增的数字

这题看似简单但是新知识点挺多

1
2
3
4
5
6
7
//整数转字符串
string s = to_string(n);
//int和long分别能表示的整数范围(正方向)
int:2,147,483,647 10位数 或32767(32位)
long:... 2,147,483,647
//字符串转整数
return stoi(s);