贪心算法part03算法

贪心算法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[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;
    }
}

你可能感兴趣的:(算法,算法,贪心算法,数据结构)