思路:这个题目和我的毕业设计撞题,一看到这个题目就有思路啦,不过是暴力解法,两层for循环就可以解决,依次比较后面的数是否大于前面的数,记录下最大值,就是最佳买股票的时机,所以我就有了如下代码:
int maxProfit(vector<int>& prices) {
int max = 0;
for(int i=0;i<prices.size();i++){
for(int j=i+1;j<prices.size();j++){
if(i<j && prices[j]-prices[i]>max) max=prices[j]-prices[i];
}
}
return max;
}
时间复杂度 O(n*n)
空间复杂度 O(1)
通过了大部分的案例,但是超出了时间限制,什么变态的测试数据啊。
所以我只能优化算法,把时间控制一下。
想了很久,其中考虑到用动态规划的方法,但是我不会。后面我实在不会了,就请教了一下同学,原来我一层循环也是可以做出来的,边循环边比较即可。
因为是取买入的最小值,卖出的最大值,求其中的利润就是最大利润,这个时间也是买股票的最佳时间。所以在一次循环中,买股票只需要比较最左最小值,卖出股票去最右最大值。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int low = INT_MAX;
int result = 0;
for (int i = 0; i < prices.size(); i++) {
low = min(low, prices[i]);
result = max(result, prices[i] - low);
}
return result;
}
};
时间复杂度 O(n)
空间复杂度 O(1)
执行结果放在下面了,时间还是有点慢,感觉动态规划的贪心算法可能会好一些,下次一定学。
还有今天学到了INT_MAX函数,是c++的最大值,以后min就不要在 999999 了。
还有今天第一次看到vector类型,我去学习了一下它的用法。
vector是最常用的容器之一,因为功能十分强大,且灵活易用,可以存储、管理各种类型的数据,所以在很多情况下可以用来代替功能比较局限的普通数组。
声明:vector prices 声明一个int类型的名叫prices的vector容器。
其成员函数有:
求容器的长度: prices.size()
返回首个元素:prices.front() 返回尾部元素:prices.back()
指定位置插入元素: prices.insert() 在指定位置删除元素:prices.erase()等等
总结:今天学习到了vector容器,以后又多一种工具去写题,还学到了INT_MAX,收获普丰。