菜鸟起飞,今天开始刷leetcode,从easy的数组开始。
- 121 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
1.1 我的方法:暴力法
直接从第一天开始遍历,算出在当天买入后在之后每天卖出的利润,取最大值,时间复杂度O(n^2),空间复杂度O(1),只使用两个变量。
好久打代码好多语法问题。1,数组的length是属性,不是方法,调用时不用加括号在字符串是方法,记得要加括号。2,在leetcode不用输出,是直接函数返回值。3,Math函数名首字母大写。
class Solution {
public int maxProfit(int[] prices) {
int profit=0,maxProfit=0;
for(int i=0;i<prices.length-1;i++) {
for(int j=i+1;j<prices.length;j++)
{ if(prices[j]>prices[i])
{ profit=prices[j]-prices[i]; } maxProfit=Math.max(profit,maxProfit); } }
return maxProfit; }}
1.2 一个巧妙的方法
从第一天起,找到第一个谷底,然后算从这天起到之后最大利润,如果遇到有一天的价格比谷底还要低,那么就选择这个新的点作为谷底,同时比较从这个新的点开始的最大利润跟之前的哪个大。因为这个新的谷底更低,之后遇到最高峰差值更大,而如果没有那么之前的最大利润也不会被替换。时间复杂度O(N),空间复杂度O(1)。
class Solution { public int maxProfit(int[] prices) {
int maxProfit=0,minvalue=Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++) {
if(prices[i]<minvalue)
minvalue=prices[i];
else if(prices[i]-minvalue>maxProfit)
maxProfit=prices[i]-minvalue; }
return maxProfit; }}
1.3 看到一个有趣的做法:求数组的差值可以转为求连续最长子序列和。这个用到贪心算法了,等以后撸到那里再来补。
2.122买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
2.1 我的解法:每天都看,只要有利润,就买入卖出。看了一下这个方法最简单,要是现实生活中也能这样开上帝视角多好啊。
class Solution {
public int maxProfit(int[] prices) {
int profit=0;
for(int i=0;i<prices.length-1;i++)
{ if(prices[i+1]>prices[i])
{ profit+=prices[i+1]-prices[i]; } }
return profit; }}
一点疑惑,明明空间复杂度只有O(1),为什么我的内存消耗这么高,那些37,38mb的怎么做到的。
最后吐槽一下,第一次写有代码的,从leetcode的代码怎么复制到这格式就不太行了。