行业知识
day34贪心算法 part03
2026-11-09 13:02:26
来源:互联网转载
1005. K 次取反后最大化的数组和
���单
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
class Solution { public int largestSumAfterKNegations(int[] nums, int k) { // 先按绝对值大到小排个序 reverseAbsNms(nums); for (int i = 0; i 0) { // K > 0也是个很重要的条件 nums[i] = -nums[i]; k--; } } // 如果K还大于0,那么反复转变数值最小的元素,将K用完 if (k % 2 == 1) nums[nums.length - 1] = -nums[nums.length - 1]; int sum = 0; for (int i = 0; i 134. 加油站
中等
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
难点:总油量减去总消耗大于等于零为什么一定可以跑完一圈?i如果无法到j的话,那么i和j之间的点也无法到达j的理论,推不出来就背吧
class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; // 考虑从每一个点出发 for (int start = 0; start 135. 分发糖果
困难
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
/*分两个阶段1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 12、起点下标 ratings.length - 2 从右往左, 只要左边比右边大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大 */class Solution { public int candy(int[] ratings) { int[] candyNums = new int[ratings.length]; Arrays.fill(candyNums, 1); // 从前向后 for (int i = 1; i ratings[i - 1]) candyNums[i] = candyNums[i - 1] + 1; } // 从后向前 int result = candyNums[ratings.length - 1]; for (int i = ratings.length - 2; i >= 0; i--) { // 左比右大 if (ratings[i] > ratings[i + 1]) { // 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值, //这样才符合 它比它左边的大,也比它右边大 candyNums[i] = Math.max(candyNums[i], candyNums[i + 1] + 1); } result += candyNums[i]; } return result; }}
上一篇:服务器加密认证怎么解除?
下一篇:网站描述怎么修改吗?