● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果
https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
//每次我都取最小的元素进行取反,那所有的不就最大吗
while(k>0){
k--;
//找出最小值的下标
int index=findMinIndex(nums);
//改变该值(进行取反)
nums[index]=-nums[index];
}
//整个数组再进行求和
int result=0;
for(int i=0;i<nums.length;i++){
result+=nums[i];
}
return result;
}
public int findMinIndex(int[] nums){
//记录最小值的下标
int index=0;
int min=nums[0];
for(int i=1;i<nums.length;i++){
if(min<nums[i]){
min=min;
index=index;
}else{
min=nums[i];
index=i;
}
}
return index;
}
}
https://leetcode.cn/problems/gas-station/description/
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
//求能支持走一圈的索引
//定义一个变量存储当前油量(都是加上和消耗抵消后的)
int curSum=0;
//定义一个变量存储总的油量(都是加上和消耗抵消后的)
int totalSum=0;
//出发位置的下标
int start=0;
for(int i=0;i<gas.length;i++){
curSum+=(gas[i]-cost[i]);
totalSum+=(gas[i]-cost[i]);
//如果现在收集到的油量不足为空了,那么我们就记录下开始的位置
if(curSum<0){
start=i+1;
//重置当前储存的油量
curSum=0;
}
}
if(totalSum<0){return -1;}
return start;
}
}
https://leetcode.cn/problems/candy/description/
class Solution {
public int candy(int[] ratings) {
//每个孩子至少分配到 1 个糖果。
//相邻两个孩子评分更高的孩子会获得更多的糖果(左右两边分别得比较,分两步去处理)
//定义一个糖果数量数组,每个下标对应每个孩子,每个元素对应糖果数量
int result=0;
int[] candy=new int[ratings.length];
candy[0]=1;
//都初始化为为1
// for(int i=0;i<candy.length;i++){
// candy[i]=1;
// }
//数组从左往右:右边孩子比左边孩子得分高
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
//提高右边孩子的值(是左边孩子的+1)
candy[i]=candy[i-1]+1;
}else{
candy[i]=1;
}
}
//数组从右往左:左边孩子比右边孩子的得分高
for(int i=ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
//在原来的,和现在在右边孩子的+1中取最大值
candy[i]=Math.max(candy[i],candy[i+1]+1);
}
}
//计算糖果数量
for(int i=0;i<candy.length;i++){
result+=candy[i];
}
return result;
}
}