从今天开始坚持每天在LeetCode坚持刷书记算法题有兴趣的小伙伴可以和我一起坚持刷题
Java版本
链接:初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/leetbook/detail/top-interview-questions-easy/买卖股票的最佳时机 II链接:初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/leetbook/detail/top-interview-questions-easy/
数组
1.删除排序数组中的重复项
初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台删除排序数组中的重复项:初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
思路:使用双指针,用left指向第一个不相同的数,通过移动right的位置来替换++left位置的重复数字,并用num统计数字的个数
class Solution {
public int removeDuplicates(int[] nums) {
int num=1;
int size=nums.length;
if(size==0) {
return 0;
}
int left=0,right=1;
for(right=1;right<size;right++) {
if(nums[left]!=nums[right]) {
nums[++left]=nums[right];
num++;
}
}
return num;
}
}
2.买卖股票的最佳时机 II
初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台买卖股票的最佳时机 II:初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
思路1:只需要比较相邻两天的股票价钱,如果第二天大于第一天就进行交易这样得到的和就是股票可以得到的最大利润(这个方法最简单易懂)
public class Solution {
public int maxProfit(int[] prices) {
int money=0;
for (int i = 0; i < prices.length-1; i++) {
if(prices[i]<prices[i+1]) {
money+=prices[i+1]-prices[i];
}
}
return money;
}
}
思路2:买入的是低点如果连续几日都是下降,那么我们就找最低的点为买入点,然后找到上升到最高的点卖出重复这个循环加起来所有的利润(贪心算法)
public class Solution2 {
public int maxProfit(int[] prices) {
int index=0;
int size=prices.length;
int sum=0;
while(index<size) {
while(index<size-1&&prices[index]<prices[index+1]) {
index++;
}
int min=prices[index];
while(index<size-1&&prices[index]>prices[index+1]) {
index++;
}
sum+=prices[index]-min;
}
return sum;
}
}
思路3:当天只可能存在手里有股票和没股票两种情况所以只需要得到每一天可以得到最大利润的情况把所有天的利润加起来就可以得到最大利润(参考来自LeetCode作者sdwwld - 力扣(LeetCode))
定义dp[i][0]表示第i+1天交易完之后手里没有股票的最大利润,dp[i][1]表示第i+1天交易完之后手里持有股票的最大利润。
当天交易完之后手里没有股票可能有两种情况,一种是当天没有进行任何交易,又因为当天手里没有股票,所以当天没有股票的利润只能取前一天手里没有股票的利润。一种是把当天手里的股票给卖了,既然能卖,说明手里是有股票的,所以这个时候当天没有股票的利润要取前一天手里有股票的利润加上当天股票能卖的价格。这两种情况我们取利润最大的即可,所以可以得到
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
当天交易完之后手里持有股票也有两种情况,一种是当天没有任何交易,又因为当天手里持有股票,所以当天手里持有的股票其实前一天就已经持有了。还一种是当天买入了股票,当天能买股票,说明前一天手里肯定是没有股票的,我们取这两者的最大值,所以可以得到
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
动态规划的递推公式有了,那么边界条件是什么,就是第一天
如果买入:dp[0][1]=-prices[0];
如果没买:dp[0][0]=0;
public class Solution1 {
public int maxProfit(int[] prices) {
int dp[][]=new int[prices.length][2];
dp[0][1]=-prices[0];
dp[0][0]=0;
for (int i = 1; i < prices.length; i++) {
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
}
return dp[prices.length-1][0];
}
}