1005.K次取反后最大化的数组和
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。
思路:排序后遍历数组,先把绝对值大的负数修改为正的,如果次数没有用完的话,选择一个绝对值最小的正数变为负数。实现方式各有不同。
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int temp = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] < 0 && k > 0){
nums[i] = - nums[i];
k --;
temp = i;
}
}
int index = 0;
if(k % 2 == 1){
if(temp < nums.length - 1){
index = Math.abs(nums[temp]) > Math.abs(nums[temp + 1]) ? temp + 1 : temp;
}else{
index = temp;
}
nums[index] = - nums[index];
}
int result = 0;
for(int i = 0; i < nums.length; i ++){
result += nums[i];
}
return result;
}
}
134.加油站
思路:从0开始遍历,一旦发现途经数值的和小于零,则这几个数值都不能作为开始,curSum清零,start变为i + 1。直到结束,如果总和小于零则不能完成,否则返回记录的start值。
方法二:记录minSum,倒序遍历看到那个位置能把空缺填上,返回。
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int totalSum = 0;
int curSum = 0;
int start = 0;
for(int i = 0; i < gas.length; i++){
totalSum += gas[i] - cost[i];
curSum += gas[i] - cost[i];
if(curSum < 0){
start = (i + 1) % gas.length;
curSum = 0;
}
}
if(totalSum < 0)
return -1;
return start;
}
}
135.分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
- 每个孩子至少分配到 1 个糖果。
- 相邻的孩子中,评分高的孩子必须获得更多的糖果。
- 那么这样下来,老师至少需要准备多少颗糖果呢?
思路:从左到右遍历,右侧数值大的多给糖果,再从右到左遍历,左边大的多给并计算和左侧遍历相比谁更大。
注意:第一次运行出现错误:
- 第二次遍历是i - -,不要顺手习惯+ +
- length单词拼写错误
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] candy = new int[len];
candy[0] = 1;
for(int i = 0; i < len - 1; i ++){
if(ratings[i] < ratings[i + 1]){
candy[i + 1] = candy[i] + 1;
} else{
candy[i + 1] = 1;
}
}
for(int i = len - 1; i > 0; i --){
if(ratings[i] < ratings[i - 1]){
candy[i - 1] = Math.max(candy[i] + 1, candy[i - 1]);
}
}
int res = 0;
for(int i = 0; i < len; i ++){
res += candy[i];
}
return res;
}
}