算法训练day32-贪心算法-买卖股票的最佳时机II

122.买卖股票的最佳时机

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

思路

算法训练day32-贪心算法-买卖股票的最佳时机II_第1张图片

 代码

class Solution {
    public int maxProfit(int[] prices) {
       int result = 0;
       for(int i=0;i0){
               result += prices[i+1] - prices[i];
           }
       }
       return result;
    } 
}

55.跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

思路

通过统计最大覆盖范围是否能够覆盖到最后一个元素从而判断能否到达最后一个目标。

代码

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length==1){
            return true;
        }
        // 初始覆盖范围为0
        int coverRange = 0;
        for(int i=0;i<=coverRange;i++){
            coverRange = Math.max(coverRange,i+nums[i]);
            // 当总体覆盖范围大于等于数组长度时说明可以到达最后一个元素
            if(coverRange>=nums.length-1){
                return true;
            }
        }
        return false;
    }
}

45.跳跃游戏II

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

思路

在上题的基础上,每次都跳最大值,每跳一次步数加1,跳完刚好覆盖到终点,此时步数最小。

代码

class Solution {
    public int jump(int[] nums) {
        int result = 0;
        // 当前覆盖的最远距离下标
        int end = 0;
        // 下一步覆盖的最远距离下标
        int temp = 0;
        for (int i = 0; i <= end && end < nums.length - 1; ++i) {
            temp = Math.max(temp, i + nums[i]);
            // 可达位置的改变次数就是跳跃次数
            if (i == end) {
                end = temp;
                result++;
            }
        }
        return result;
    }
}

你可能感兴趣的:(java,数据结构与算法,算法,java,leetcode)