买股票的最佳时机

101 阅读1分钟

思路:这个题目和我的毕业设计撞题,一看到这个题目就有思路啦,不过是暴力解法,两层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)

通过了大部分的案例,但是超出了时间限制,什么变态的测试数据啊。

image-20230417203917343.png

所以我只能优化算法,把时间控制一下。

想了很久,其中考虑到用动态规划的方法,但是我不会。后面我实在不会了,就请教了一下同学,原来我一层循环也是可以做出来的,边循环边比较即可。

因为是取买入的最小值,卖出的最大值,求其中的利润就是最大利润,这个时间也是买股票的最佳时间。所以在一次循环中,买股票只需要比较最左最小值,卖出股票去最右最大值。

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)

执行结果放在下面了,时间还是有点慢,感觉动态规划的贪心算法可能会好一些,下次一定学。

image-20230417210523289.png

还有今天学到了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,收获普丰。