算法思想
采用贪心的策略,保证每次操作都是局部最优解,从而最终的结果是全局最优。贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具有无后效性,即某个状态以前的过程不会影响以后的状态,只和当前的状态相关。
包括分配问题(455,135)和区间问题(435);
练习:605,452,763,122,406。
区间问题-买卖股票的最佳时机 II(122.,easy)
题目描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
输入输出样例
示例1
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
解题思路:
遍历数组,递增继续,递减则停止并收取利润,即保证最大时间段获取最大利润
题解
//owner
class Solution {
public int maxProfit(int[] prices) {
int count = 0;
int n = 0, number = 0;
for(int i = 0; i < prices.length-1;i++){
if(prices[i] <= prices[i+1] && count == 0){
count = 1;
n = prices[i];
}else if(prices[i] <= prices[i+1] && count == 1){
continue;
}else if(prices[i] > prices[i+1] && count == 0 ){
continue;
}else{
number += prices[i] - n;
count = 0;
}
}
if(count == 1) number += prices[prices.length-1] - n;
return number;
}
}
解题思路:贪心算法
由于不限制交易次数,只要今天股价比昨天高,就交易。
保证每天的利润最大即可。
pn-p1=p2-p1+(p3-p2)+···+(pn-1 - pn-2) +(pn-pn-1)
题解
//贪心算法
class Solution {
public int maxProfit(int[] prices) {
int count = 0, number = 0;
for(int i = 1; i < prices.length; i++){
count = prices[i] - prices[i-1];
if(count > 0){
number += count;
}
}
return number;
}
}
资源学习
来自LeetCode 101:和你一起你轻松刷题(C++)(github.com/changgyhub/leetcode_101)和leetcode题库(https://leetcode-cn.com/problems/non-overlapping-intervals)