贪心算法part03
● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果
1.leetcode 1005.K次取反后最大化的数组和
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;}
}
2.leetcode 134. 加油站
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;}
}
3.leetcode 135. 分发糖果
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;}
}