代码随想录训练营第34天|1005.K次取反后最大化的数组和,134. 加油站,135. 分发糖果
1005.K次取反后最大化的数组和
文章
思路
以K个为限,将最小的负数取反后求和
如果负数的个数少于K
则判断剩余取反次数的奇偶性,如果是偶数次则相当于不需要继续取反,如果是奇数次则将当前数组内绝对值最小的取反
代码
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int negs, zeros, pos_bot, neg_top, sum;
int i, n;
n = nums.length;
i = 0;
sum = 0;
negs = 0;
neg_top = 0x80000000;
pos_bot = 0x7fffffff;
while (i < n && i < k) {
if (nums[i] < 0) {
neg_top = nums[i];
sum -= neg_top;
++negs;
} else {
break;
}
++i;
}
if (i == k) {
while (i < n) {
sum += nums[i];
++i;
}
} else {
if ((k - i) % 2 == 0) {
while (i < n) {
sum += nums[i];
++i;
}
} else {
if (i < n && nums[i] == 0) {
while (i < n) {
sum += nums[i];
++i;
}
} else {
if (i > n - 1) {
sum += 2 * neg_top;
} else {
if (nums[i] + neg_top > 0) {
sum += 2 * neg_top;
while (i < n) {
sum += nums[i];
++i;
}
} else {
sum -= nums[i];
++i;
while (i < n) {
sum += nums[i];
++i;
}
}
}
}
}
}
return sum;
}
}
134.加油站
文章
思路
40分钟没有想出思路
看卡哥的文章后有一点不理解,如果只是从0到n-1遍历一次,如何能保证所谓的start在n-1之后从0开始到start-1的过程中不会出现curSum小于零
代码
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int i, n, start;
n = gas.length;
int rest;
int curSum = 0;
int totalSum = 0;
start = 0;
for (i = 0; i < n; ++i) {
rest = gas[i] - cost[i];
curSum += rest;
totalSum += rest;
if (curSum < 0) {
start = i + 1;
curSum = 0;
}
}
return totalSum < 0 ? -1 : start;
}
}
135.分发糖果
文章
思路
卡哥提示:两个方向分两次考虑
先从左往右,满足严格递增的,右等于左加1
再从右往左,满足严格递增的,左等于原值与右加1二者间较大值
代码
class Solution {
public int candy(int[] ratings) {
int i, n, num;
i = 0;
num = 0;
n = ratings.length;
int[] candies = new int[n];
while (i < n) {
if (i == 0 || ratings[i] <= ratings[i - 1]) {
candies[i] = 1;
} else {
candies[i] = candies[i - 1] + 1;
}
++i;
}
i = n - 1;
while (i > -1) {
if (i != n - 1 && ratings[i] > ratings[i + 1]) {
candies[i] = Math.max(candies[i + 1] + 1, candies[i]);
}
num += candies[i];
--i;
}
return num;
}
}
总结
134好难
但我没有时间多想了,马上要去实习的公司上班
绝望