貪欲なアルゴリズム 3
LeetCode 1005 K 回の否定後の配列和の最大化 2023.11.27
int largestSumAfterKNegations(vector<int>& nums, int k) {
//sum记录数组和
int sum = 0;
//先排一次序,从小到大
sort(nums.begin(), nums.end());
//开始操作
while (k--)
{
//始终对第一个操作,因为要么其是负值最小的(绝对值最大),要么是正值最小的(绝对值最小)
nums[0] *= (-1);
//再排序,为下一次操作准备
sort(nums.begin(), nums.end());
}
//求和并返回
for (int i = 0; i < nums.size(); i++)
sum += nums[i];
return sum;
}
LeetCode 134 ガソリンスタンド 2023.11.27
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
/*自己写的暴力求解,通过34/40,最后几个样例太大超时
//cur记录当前油量
int cur = 0;
//to记录当前到达的加油站位置
int to = -1;
//开始遍历计算
for (int i = 0; i < gas.size(); i++)
{
//to记录下一次遍历的加油站位置,初始为i
to = i;
//cur更新为当前加油站油量
cur = gas[i];
//当此时油量大于cost时进行下一次遍历计算
while(cur >= cost[to])
{
//判断to是否走到最后,没走到则i++并更新cur
if(to < gas.size()-1)
{
cur -= cost[to];
to++;
cur += gas[to];
}
//判断to是否走到最后,走到则i=0并更新cur
else
{
cur -= cost[to];
to = 0;
cur += gas[to];
}
//判断是否回到了第二次遍历的起始加油站位置,到了则返回i
if(to == i)
return i;
}
}
//上面没返回则返回-1,没合适路线
return -1;
*/
//贪心算法
//cursum记录从start开始到i的剩余流量
int cursum = 0;
//totalsum记录整圈的净油量(剩余油量)
int totalsum = 0;
//start记录开始索引
int start = 0;
//开始遍历计算
for (int i = 0; i < gas.size(); i++)
{
//更新cursum与toatlsum
cursum += (gas[i] - cost[i]);
totalsum += (gas[i] - cost[i]);
//如果cursum<0说明到达不了i加油站位置
//那么更新起始位置为下一站,并更新cursum为0
if(cursum < 0)
{
start = i + 1;
cursum = 0;
}
}
//遍历结束后,如果totalsum小于0 说明加油站油不够跑完全程,则返回-1
if(totalsum < 0)
return -1;
//没返回-1则返回开始索引start
return start;
}
LeetCode 135 キャンディー配布 2023.11.27
int candy(vector<int>& ratings) {
//result存储最终糖果数目
int result = 0;
//数组记录每个学生所发糖果数,默认都为1
vector<int> candy(ratings.size(), 1);
//从前往后遍历,当当前遍历学生得分大于上一个学生得分时,糖果数更新为上一个学生糖果数+1
for (int i = 0; i < ratings.size(); i++)
{
if(i > 0 && ratings[i] > ratings[i-1])
candy[i] = candy[i-1] + 1;
}
//从后往前遍历,当当前遍历学生得分小于上一个学生得分时,
//上一个学生糖果数更新为max(上一个学生糖果数,当前学生糖果数+1)
for (int i = ratings.size()-1; i >= 0; i--)
{
if(i > 0 && ratings[i-1] > ratings[i])
candy[i-1] = max(candy[i-1], candy[i]+1);
result += candy[i];
}
return result;
}