嘉兴市做外贸网站的公司,优化系统流程,怎么给QQ名片做网站,北京科技公司名单第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) - Math.ab… 第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) - Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue).toArray();int len nums.length; for (int i 0; i len; i) {//从前向后遍历遇到负数将其变为正数同时K--if (nums[i] 0 K 0) {nums[i] -nums[i];K--;}}// 如果K还大于0那么反复转变数值最小的元素将K用完if (K % 2 1) nums[len - 1] -nums[len - 1];return Arrays.stream(nums).sum();}
} 思路让绝对值最大的负数变为正数如果负数都变为正数了k还大于0就把最小的正数反复×负号。 134. 加油站// 解法2
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int curSum 0;int totalSum 0;int index 0;for (int i 0; i gas.length; i) {curSum gas[i] - cost[i];totalSum gas[i] - cost[i];if (curSum 0) {index (i 1) % gas.length ; curSum 0;}}if (totalSum 0) return -1;return index;}
} 思路把每个点的存储或消耗的油量算出来如果从一个点走到另一个点curSum0那么就从i1出发只要totalSum0总有一个点可以当出发点。 135. 分发糖果 class Solution {/**分两个阶段1、起点下标1 从左往右只要 右边 比 左边 大右边的糖果左边 12、起点下标 ratings.length - 2 从右往左 只要左边 比 右边 大此时 左边的糖果应该 取本身的糖果数符合比它左边大 和 右边糖果数 1 二者的最大值这样才符合 它比它左边的大也比它右边大*/public int candy(int[] ratings) {int len ratings.length;int[] candyVec new int[len];candyVec[0] 1;for (int i 1; i len; i) {candyVec[i] (ratings[i] ratings[i - 1]) ? candyVec[i - 1] 1 : 1;}for (int i len - 2; i 0; i--) {if (ratings[i] ratings[i 1]) {candyVec[i] Math.max(candyVec[i], candyVec[i 1] 1);}}int ans 0;for (int num : candyVec) {ans num;}return ans;}
} 思路要把左右孩子分开比较一起比较容易顾此失彼而且要先从前往后再从后往前把最近更新的都利用上从后往前更新时要将原糖果数和candy[i1]1相比较取满足条件的最大值。