算法训练营day33
一、K次取反后最大化的数组和
- 贪心:尽可能将所有的负数转换为正数以达到整体最大值
- 分情况,讨论k和负数数量的关系,0是否存在的问题
- 模拟顾名思义,模拟题目的操作来解决问题(直接解决),而不是靠技巧解决
class Solution { public int largestSumAfterKNegations(int[] nums, int k) { //贪心 + 分情况讨论 + 模拟 int n = nums.length, idx = 0; PriorityQueue q = new PriorityQueue((a,b)->nums[a]-nums[b]); boolean zero = false; for(int i = 0; i if(nums[i]二、加油站
重点是发现暴力解法到底哪里浪费时间
(图片来源网络,侵删)
- 当前surplus
- 前提 [0,j-1] + [j,i]的总和
- [0,j-1] > 0 ,[j,i] 0
class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; int total_surplus = 0; int surplus = 0; int start = 0; for(int i = 0; i三、分发糖果
参考链接Candy - LeetCode
理解代码并不难,左规则能理解,现在开始深入剖析右规则,分情况讨论实现右规则时是否会对左规则产生影响
class Solution { public int candy(int[] ratings) { int n = ratings.length; int[] candies = new int[n]; Arrays.fill(candies, 1); for (int i = 1; i ratings[i - 1]) { candies[i] = candies[i - 1] + 1; } } for (int i = n - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { candies[i] = Math.max(candies[i], candies[i + 1] + 1); } } int totalCandies = 0; for (int candy : candies) { totalCandies += candy; } return totalCandies; } }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。