吉安做网站的,软件开发方案怎么写,百度搜索图片,wordpress 不用主题一、LeetCode122. 买卖股票的最佳时机 II
题目链接#xff1a;122. 买卖股票的最佳时机 II
题目描述#xff1a;
给你一个整数数组 prices #xff0c;其中 prices[i] 表示某支股票第 i 天的价格。
在每一天#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 …一、LeetCode122. 买卖股票的最佳时机 II
题目链接122. 买卖股票的最佳时机 II
题目描述
给你一个整数数组 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 。
示例 2
输入prices [1,2,3,4,5]
输出4
解释在第 1 天股票价格 1的时候买入在第 5 天 股票价格 5的时候卖出, 这笔交易所能获得利润 5 - 1 4 。总利润为 4 。
示例 3
输入prices [7,6,4,3,1]
输出0
解释在这种情况下, 交易无法获得正利润所以不参与交易可以获得最大利润最大利润为 0 。 提示
1 prices.length 3 * 1040 prices[i] 104
算法分析
利用贪心。
局部最优下一天的股票价格高于当天的股票价格当天买入股票下一天出售股票就可以获得两天股票价格差的利润。
全局最优所有利润加起来就是能够获得的最大利润。
代码如下
class Solution {public int maxProfit(int[] prices) {int sum 0;//利润for(int i 0; i prices.length - 1; i) {//只要下一天的股票价格高于当天的股票价格那么就可以在当天买入股票下一天出售股票获得下一天股票价格减去当天股票价格的利润。if(prices[i 1] prices[i]) sum prices[i 1] - prices[i];}return sum;}
}
二、LeetCoed55. 跳跃游戏
题目链接55. 跳跃游戏
题目描述
给你一个非负整数数组 nums 你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标如果可以返回 true 否则返回 false 。 示例 1
输入nums [2,3,1,1,4]
输出true
解释可以先跳 1 步从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2
输入nums [3,2,1,0,4]
输出false
解释无论怎样总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 所以永远不可能到达最后一个下标。提示
1 nums.length 1040 nums[i] 105
算法分析
局部最优遍历每一步所能够走到的地方同时更新下一步能够走到的最大范围。
全局最优如果下一步能够走到的最大范围超过了数组最后一个元素的下标说明是可以走到这个地方的。
代码如下
class Solution {public boolean canJump(int[] nums) {int index nums[0];//记录第一步能走到的最大范围for(int i 0; i index; i) {//遍历能走到的地方if(index nums.length - 1) return true;//如果最大范围大于等于最后一个元素的下标说明可以跳到最后一个元素返回true//在第i个位置时所能跳到的最大范围是inums[i]更新一下下一步能够走到的最大范围。index index i nums[i] ? index : i nums[i];}return false;}
}
三、LeetCode45. 跳跃游戏 II
题目链接45. 跳跃游戏 II
题目描述
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说如果你在 nums[i] 处你可以跳转到任意 nums[i j] 处:
0 j nums[i] i j n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。 示例 1:
输入: nums [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置跳 1步然后跳 3步到达数组的最后一个位置。示例 2:
输入: nums [2,3,0,1,4]
输出: 2提示:
1 nums.length 1040 nums[i] 1000题目保证可以到达 nums[n-1]
算法分析
用三个变量分别记录当前这一步的起始下标步数和下一步所能到达的最大范围。
局部最优每次走能跨最大范围的那一步。遍历当前这一步所能走到的位置跟新下一步的起始位置和最大范围跟新步数。
全局最优下一步的最大范围超过数组最后一个元素下标时说明只需再走一步就可以到达了。
代码如下
class Solution {public int jump(int[] nums) {if(nums.length 1) return 0;int index nums[0];//下一步所能走到的最大范围int steps 0;//步数int start 0;//每一步的起始下标while(index nums.length - 1) {//如果下一步走到的最大范围大于等于数组的最后一个元素下标直接一步走完int maxindex index;//记录当前这一步所能到达的最大位置for(int i start; i maxindex; i) {//遍历当前这一步所能到达的位置if(i nums[i] index) {//更新下一步所能走到的最大位置同时标记下一步的起始下标index nums[i] i;start i;}}steps;//跟新当前步数}steps;//走最后一步才能到达return steps;}
}
总结
贪心算法
难点是如何找到局部最优然后如何推到全局最优。