代码随想录算法训练营Day28
买卖股票的最佳时机
每天的利润组成一个数组,取数组中的正数(局部最优),加起来就是总的最大的利润
class Solution {
public int maxProfit(int[] prices) {
int[] profit = new int[prices.length-1];
int j = 0;
int result = 0;
for(int i = 1;i<prices.length;i++){
result += Math.max(prices[i] - prices[i-1],0);
}
return result;
}
}
跳跃游戏
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(cover,i+nums[i]);
if(i+nums[i]>=nums.length-1){
return true;
}
}
return false;
}
}
跳跃游戏2
局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。
要从覆盖范围出发,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
每次跳之前看最远能跳到哪,然后遍历你这个能跳的范围里的所有点,找到一个能跳的离终点更近的点跳过去。
class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return 0;
}
int count = 0;
int curcover = 0;//当前覆盖范围
int nextcover = 0;//下一步覆盖范围
for (int i = 0; i < nums.length; i++) {
nextcover = Math.max(nextcover, i + nums[i]);
if (i == curcover && curcover < nums.length - 1) {
count++;
curcover = nextcover;
}
if (curcover >= nums.length - 1) {
break;
}
}
return count;
}
}
K次取反后最大的数组和
按绝对值从大到小排序数组
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
int result = 0;
nums = IntStream.of(nums)
.boxed()
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
.mapToInt(Integer::intValue).toArray();
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0 && k > 0) {
nums[i] = -nums[i];
k--;
} //全是正数了,那么最小的正数即为最右边的数
}
if (k % 2 == 1) {
nums[nums.length - 1] *= -1;
} //如果是偶数,乘和不乘一样
for (int i = 0; i < nums.length; i++) {
result += nums[i];
}
return result;
}
}

浙公网安备 33010602011771号