LeetCode 面試經典 150_數組/字符串_買賣股票的最佳時機(7_121_C++_簡單)
- 題目描述:
- 輸入輸出樣例:
- 題解:
- 解題思路:
- 思路一(貪心算法):
- 代碼實現
- 代碼實現(思路一(貪心算法)):
- 以思路一為例進行調試
題目描述:
給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。
你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。
返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0 。
輸入輸出樣例:
示例 1:
輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格;同時,你不能在買入前賣出股票。
示例 2:
輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤為 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
題解:
解題思路:
思路一(貪心算法):
1、尋找買賣股票的最佳時機,其實就是最低點買入,最高點賣出,且低點要在高點之前。所以記錄當前時間點之前的最低點,通過遍歷所有時間點,判斷當前時間與之前對低點的差值來尋找買賣股票的最佳時機。
2、復雜度分析:
① 時間復雜度:O(n),n代表數組中元素的個數。只遍歷了一遍數組,所以時間復雜度為O(n)。
② 空間復雜度:O(1)。
代碼實現
代碼實現(思路一(貪心算法)):
class Solution {
public:int maxProfit(vector<int>& prices) {// 初始化:min_price為第一個價格,ans為0(初始利潤)int min_price = prices[0], ans = 0;// 遍歷prices數組中的每個價格(i表示當前價格)for (auto const &i : prices) {// 計算當前價格與最低價格之間的利潤,更新最大利潤ans// 如果當前利潤(i - min_price)大于之前記錄的最大利潤(ans),則更新ansans = i - min_price > ans ? i - min_price : ans;// 更新min_price為當前價格與歷史最低價格中的較小值min_price = min(i, min_price);}// 返回最大利潤,如果最大利潤大于0則返回,否則返回0(避免負利潤)return ans > 0 ? ans : 0;}
};
以思路一為例進行調試
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;class Solution {
public:int maxProfit(vector<int>& prices) {// 初始化:min_price為第一個價格,ans為0(初始利潤)int min_price = prices[0], ans = 0;// 遍歷prices數組中的每個價格(i表示當前價格)for (auto const &i : prices) {// 計算當前價格與最低價格之間的利潤,更新最大利潤ans// 如果當前利潤(i - min_price)大于之前記錄的最大利潤(ans),則更新ansans = i - min_price > ans ? i - min_price : ans;// 更新min_price為當前價格與歷史最低價格中的較小值min_price = min(i, min_price);}// 返回最大利潤,如果最大利潤大于0則返回,否則返回0(避免負利潤)return ans > 0 ? ans : 0;}
};int main(int argc, char const *argv[])
{vector<int> prices={7,1,5,3,6,4};Solution s;cout<<s.maxProfit(prices);return 0;
}
LeetCode 面試經典 150_數組/字符串_買賣股票的最佳時機(7_121)原題鏈接
歡迎大家和我溝通交流(????)