• 算法D33 | 贪心算法3 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果


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

    本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。 

    代码随想录

    Python:

    1. class Solution:
    2. def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
    3. nums.sort(key=lambda x: abs(x), reverse=True) # 关键:按绝对值降序排列
    4. for i in range(len(nums)):
    5. if nums[i]<0 and k>0:
    6. nums[i] = -nums[i]
    7. k -= 1
    8. if k%2==1:
    9. nums[-1] *= -1
    10. return sum(nums)

    C++:

    1. class Solution {
    2. static bool cmp(int a, int b) {
    3. return abs(a) > abs(b);
    4. }
    5. public:
    6. int largestSumAfterKNegations(vector<int>& nums, int k) {
    7. sort(nums.begin(), nums.end(), cmp); //注意:这里cmp是static method
    8. for (int i=0; isize(); i++) {
    9. if (nums[i]<0 && k>0) {
    10. nums[i] *= -1;
    11. k--;
    12. }
    13. }
    14. if (k%2==1) nums[nums.size()-1] *= -1;
    15. int ans = 0;
    16. for (int a:nums) ans+=a;
    17. return ans;
    18. }
    19. };

    134. 加油站 

    本题有点难度,不太好想,推荐大家熟悉一下方法二 

    代码随想录

    Python:

    情况三是比较难想到的,从后向前看如何覆盖cum_sum of net gas.

    • 情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。

    1. class Solution:
    2. def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
    3. cum_sum = 0
    4. min_net = float('inf')
    5. for i in range(len(gas)):
    6. cum_sum += gas[i] - cost[i]
    7. if cum_sum < min_net:
    8. min_net = cum_sum
    9. if cum_sum < 0: return -1
    10. if min_net > 0: return 0
    11. for i in reversed(range(len(gas))):
    12. min_net += gas[i] - cost[i]
    13. if min_net >= 0:
    14. return i
    15. return -1

    C++:

    1. class Solution {
    2. public:
    3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
    4. int cumSum = 0;
    5. int minCumSum = INT_MAX;
    6. for (int i=0; isize(); i++) {
    7. cumSum += gas[i] - cost[i];
    8. if (cumSum < minCumSum) minCumSum = cumSum;
    9. }
    10. if (cumSum < 0) return -1;
    11. if (minCumSum > 0) return 0;
    12. for (int i=gas.size()-1; i>=0; i--) {
    13. minCumSum += gas[i] - cost[i];
    14. if (minCumSum >=0) return i;
    15. }
    16. return -1;
    17. }
    18. };

    135. 分发糖果 

    本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路 

    代码随想录

    Python:

    1. class Solution:
    2. def candy(self, ratings: List[int]) -> int:
    3. n = len(ratings)
    4. if n == 1: return 1
    5. ans = [1] * n
    6. for i in range(1, n): # 从前往后
    7. if ratings[i] > ratings[i-1]:
    8. ans[i] = ans[i-1] + 1
    9. for i in reversed(range(n-1)): # 从后往前
    10. if ratings[i] > ratings[i+1]:
    11. ans[i] = max(ans[i], ans[i+1]+1)
    12. return sum(ans)

    C++:

    1. class Solution {
    2. public:
    3. int candy(vector<int>& ratings) {
    4. if (ratings.size()==1) return 1;
    5. vector<int> candyVec(ratings.size(), 1);
    6. for (int i=1; isize(); i++) {
    7. if (ratings[i] > ratings[i-1]) candyVec[i] = candyVec[i-1] + 1;
    8. }
    9. for (int i=ratings.size()-2; i>=0; i--) {
    10. if (ratings[i] > ratings[i+1]) candyVec[i] = max(candyVec[i], candyVec[i+1]+1);
    11. }
    12. int ans = 0;
    13. for (int c: candyVec) ans += c;
    14. return ans;
    15. }
    16. };

  • 相关阅读:
    为什么学完了 C#觉得自己什么都干不了?
    IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了
    Spire.PDF for .NET 9.8.5 Crack
    d的整与nan
    numpy常用乘法函数总结:np.dot()、np.multiply()、*、np.matmul()、@、np.prod()、np.outer()
    Reactive 判断的API(逻辑判断)
    【实例项目:基于多设计模式下的日志系统(同步&异步)】
    SRS之StateThreads学习
    动态规划 八月八日
    webrtc QOS笔记四 Nack机制浅析
  • 原文地址:https://blog.csdn.net/memolaner/article/details/136391998