2
https://leetcode.cn/problems/maximize-the-topmost-element-after-k-moves/
如果真的是堆的话,没有任何思路
如果是栈的话,先去找最大值所在的索引m,判断与k的关系
如果m>=k,说明删k个也无法到当前的最大值或者到了也没法再放回去,
那么应当去寻找前k个里的最大值
接着对于前K个里的最大值,索引不应当是k,不然无法再填回去,如果真是的话,就应当去寻找前k-1个里的最大值,这个k-1个里的最大值就真的是最大值了
DEBUG
1
没有考虑到,如果前k个里的最大值比第k+1个的数小,那么最大值就应当是第k+1个的
1
https://leetcode.cn/problems/gas-station/description/
还是要先计算一个前缀和的总和,如果总和大于等于0,说明走完一圈还有积累
如果小于0,则说明每走一圈都会亏
那么就是从前缀和最小的地方的后一个地方出发,这样走完一圈回来,得到的是累和
首先,前缀和最小的后一个地方的值必然是大于0的,不然下一个地方才是最小的地方,
除此之外,其之后必定也都是一直向上的,如果有向下的,也必然不会超过向上的累计,不然最小的地方就不是这个地方,也就是说这个地方是最谷底的地方,之后再怎么走都不会比这个地方低了
走一圈回来后,得到的是sum,如果>=0,那么就会不断向上,不然压根就回不来
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n=gas.size();
// vector<int>test;
int sum=0;
int bot=10e6;
int index;
for(int i=0;i<n;i++){
// test.push_back(gas[i]-cost[i]);
// cout<<test[i]<<endl;
sum+=(gas[i]-cost[i]);
if(sum<bot){
bot=sum;
index=i;
}
}
return ((sum>=0)?(index+1)%n:-1);
}
};