55.跳跃游戏
这道题目的重点在于:
1.不管每次能跳多远,只管跳跃范围的覆盖范围,如果最后能覆盖到最后一个元素,则可以到达最后一个下标
2.覆盖的范围是随着i的遍历而不停增加的,相当于“骑驴找马”,每个数的最大覆盖范围应该是i+nums[i],如果大于之前的cover,就更新cover,直到有某一次cover能超过最后的索引,说明可以跳到最后。
import java.util.*;
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1) return true;
int cover = 0;
for(int i = 0;i <= cover;i++){
cover = Math.max(i+nums[i],cover);
if(cover >= nums.length) return true;
}
return false;
}
}
45.跳跃游戏||
class Solution {
//思路:
//从每一次能到达的覆盖范围内,选下一个能覆盖的最大范围
public int jump(int[] nums) {
if(nums.length == 1) return 0;//如果数组只有一个,不用跳就到最后了
int cur = 0;//用于记录当前所处区间的最大可到范围的索引,刚开始的时候就是第一个值,所以是0
int res = 0;//用于记录跳跃的次数
int next = 0;//下一次可以到达的最远距离
for(int i = 0;i < nums.length;i++){
next = Math.max(nums[i]+i,next);
//i == cur的时候,说明目前所能遍历的区间已经遍历完了,这个时候需要更新下一个遍历的范围了
if(i == cur){
if(cur != nums.length-1){
//当cur的索引没有到达数组最后的时候,需要跳跃
res++;
cur = next;//更新cur索引
if(cur >= nums.length - 1) return res;
}
}
}
return res;
}
}
1005.K次取反后最大化的数组和
常识题
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int res = 0;
int minVal = Integer.MAX_VALUE;
int minIndex = 0;
//分成两步:尽这负数取反
//剩余的k如果有0,在0上面反复去反
//剩余的k如果没有0,在绝对值最小的书上面反复取反
for(int i = 0;i < nums.length;i++){
if(Math.abs(nums[i]) < minVal){
minIndex = i;
minVal = Math.abs(nums[i]);
}
if(nums[i] < 0 && k>0){
//还有负数并且k还没有消耗完
nums[i] = -nums[i];
k--;
}else if(k > 0 && nums[i] == 0){
//遇到0了但是k还没有消耗完
k = 0;
}else if(nums[i] > 0) break;//到整数了,结束循环了
}
//如果还剩下k没消耗
if(k > 0 && k % 2 == 1){
nums[minIndex] = -nums[minIndex];
}
for(int n:nums) res += n;
return res;
}
}