代码随想录打卡第34天1005. K 次取反后最大化的数组和134. 加油站135. 分发糖果

1005. K 次取反后最大化的数组和

代码链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/

把负数取反,剩下的次数如果是单数最小的数字取反。

class Solution {

public:

    int largestSumAfterKNegations(vector<int>& nums, int k) {

        sort(nums.begin(), nums.end());

        int min = INT_MAX;

        int sum =0;

        for(int i=0;i<nums.size();i++)

        {

            if(nums[i]<0&&k>0)

            {

                nums[i] = -nums[i];

                k--;

            }

            if(nums[i]<min)

                min = nums[i];

            sum = sum+nums[i];

        }

        for(int i=0;i<nums.size();i++)

            cout<<nums[i]<<" ";

        if(k>0&&k%2==1)

        {

            sum = sum-min+(-min);

        }

        return sum;

    }

};

134. 加油站

https://leetcode.cn/problems/gas-station/

思路:求每一站剩余的油量,使用cursum进行累加从起始站到当前站的油量,小于0则重新开始。

class Solution {

public:

    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {

        int cur_sum =0;

        int total_sum =0;

        int start =0;

        for(int i=0;i<gas.size();i++)

        {

            cur_sum += gas[i] - cost[i];

            total_sum += gas[i] - cost[i];

            if(cur_sum < 0)

            {

                start = i+1;

                cur_sum = 0;

            }

        }

        if(total_sum<0)

            return -1;

        if(start==gas.size())

            start = 0;

        return start;

    }

};

135. 分发糖果

https://leetcode.cn/problems/candy/

算法思想:

从左边起遍历数组,找到一个合适的分发糖果方案,此时的方案保证了当前孩子比左孩子评分高的情况下获取到更多的糖果。

从右边起遍历数组,当前孩子比右边孩子大的情况下,获取更多的糖果,同时和上一轮的糖果数量比较,取最大值

class Solution {

public:

    int candy(vector<int>& ratings) {

        vector<int> candy(ratings.size(), 1);

        for(int i = 1; i<ratings.size();i++)

        {

            if(ratings[i]>ratings[i-1])

                candy[i] = candy[i-1] + 1;

        }

        int sum = candy[ratings.size()-1];

        for(int i=ratings.size()-2; i>=0; i--)

        {

            if(ratings[i]>ratings[i+1])

            {

                candy[i] = max(candy[i+1]+1, candy[i]); //在前一个数量+1和当前数量取一个最大值;


            }

            sum += candy[i];

        }

        return sum;

    }

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容