代码随想录算法训练营第三十四天-贪心算法3| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

news/2024/11/17 19:37:03/

1005. Maximize Sum Of Array After K Negations

参考视频:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔哩_bilibili 

贪心🔍

的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

局部最优可以推出全局最优。

那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。

那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。

虽然这道题目大家做的时候,可能都不会去想什么贪心算法,一鼓作气,就AC了。

我这里其实是为了给大家展现出来 经常被大家忽略的贪心思路,这么一道简单题,就用了两次贪心!

那么本题的解题步骤为:

第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
第二步:从前向后遍历,遇到负数将其变为正数,同时K--
第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
第四步:求和

public class Leetcode1005 {public static int largestSumAfterKNegations(int[] nums, int k) {sort(nums);for (int i = 0; i < nums.length; i++) {if (k > 0 && nums[i] < 0) {nums[i] *= -1;k--;}}if (k % 2 == 1) nums[nums.length - 1] *= -1;int res = 0;for (int num : nums) {res += num;}return res;}public static void sort(int[] nums) {for (int i = 0; i < nums.length; i++) {for (int j = i + 1; j < nums.length; j++) {if (Math.abs(nums[i]) < Math.abs(nums[j])) {int temp = nums[j];nums[j] = nums[i];nums[i] = temp;}}}}
}

 134. 加油站

解题思路:

可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。

每个加油站的剩余量rest[i]为gas[i] - cost[i]。

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

public class Leetcode134 {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;}
}

 135. 分发糖果

public class Leetcode135 {public static int candy(int[] ratings) {int[] candy = new int[ratings.length];Arrays.fill(candy, 1);for (int i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1]) {candy[i] = candy[i - 1] + 1;}}System.out.println(Arrays.toString(candy));for (int i = ratings.length - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candy[i] = Math.max(candy[i + 1] + 1, candy[i]);}}System.out.println(Arrays.toString(candy));int res = 0;for (int i : candy) {res += i;}return res;}
}


http://www.ppmy.cn/news/46177.html

相关文章

MySQL 主键自增也有坑?

在上篇文章中&#xff0c;松哥和小伙伴们分享了 MySQL 的聚簇索引&#xff0c;也顺便和小伙伴们分析了为什么在 MySQL 中主键不应该使用随机字符串。但是主键不用随机字符串用什么&#xff1f;主键自增&#xff1f;主键自增就是最佳方案吗&#xff1f;有没有其他坑&#xff1f;…

sublime text的snippet介绍,提高编程效率

自定义Snippet Sublime Text 的 Snippet 是一种快捷方式&#xff0c;它允许您使用自定义模板或代码片段更快地编写代码。以下是创建 Snippet 的步骤&#xff1a; 打开 Sublime Text 编辑器并创建一个新文件。菜单栏选择 “Tools” -> “Developer” -> “New Snippet”…

文心一言眼里的SQL世界

目录 一、Java基础教程系列二、先听听文心一言怎么说&#xff1f;三、话不多说&#xff0c;开干。1、要有一个正确的数据库学习路线&#xff0c;做一个细致的MySQL学习规划。2、学习资料推荐 四、MySQL基础知识总结五、MySQL进阶六、Redis和MongoDB需要学吗&#xff1f;七、如何…

[个人笔记] Windows系列常用Shell命令工具集合

Windows - 运维篇 第四章 Windows系列常用Shell命令工具集合 Windows - 运维篇系列文章回顾CMD常用命令集网络相关命令文件管理相关命令系统相关命令其他命令 CMD常用工具集网络监控相关工具系统相关实用工具其他辅助工具 PowerShell常用命令工具集更多命令工具集参考来源 系列…

机器学习 day04(梯度下降算法,学习率,偏导数,执行过程示意图)

1. 梯度下降 我们可以用一种更系统的方法&#xff0c;来找到一组w&#xff0c;b&#xff0c;使成本函数的值最小。这个方法叫梯度下降算法&#xff0c;它可用于最小化任何函数&#xff0c;不仅仅包括线性回归的成本函数&#xff0c;也包括两个以上参数的其他成本函数在线性回…

如何使用ref和reactive你必须要知道的场景和差异

在Vue 3中&#xff0c;ref和reactive是两种不同的数据响应式处理方式。本文将介绍它们的使用场景和差异&#xff0c;并提供相关代码示例。 ref的使用场景 ref通常用于处理简单的数据类型&#xff0c;例如数字、布尔值、字符串等。它可以让我们在模板中直接使用数据&#xff0…

Chrome-mojo The Service Manager Services

https://chromium.googlesource.com/chromium/src//312b6bf/services/service_manager/README.md Chromium Mojo & IPC | 柯幽 概述 Service Manager是一个组件&#xff0c;像 Chromium 这样的大型应用程序可以使用它来支持跨平台、多进程、面向服务、连字符形容词负载的…

论:开发者信仰之“天下IT是一家“(Java .NET篇)

比尔盖茨公认的IT界领军人物&#xff0c;打造了辉煌一时的PC时代。 2008年&#xff0c;史蒂夫鲍尔默接替了盖茨的工作&#xff0c;成为微软公司的总裁。 2013年他与微软做了最后的道别。 2013年以后&#xff0c;我才真正看到了微软的变化。尤其是它的“云优先&#xff0c;移…