leetcode_question_123 Best Time to Buy and Sell Stock III
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note: You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
앞의 두 문제와 비교하면 두 번의 거래가 제한되어 있어서 이 문제가 가장 어렵다.
i를 0에서 n-1로 설정하면 각 i를 대상으로 prices의 하위 서열 [0,..., i][i,..., n-1]에서 각각 얻은 최대 이윤(첫 번째 문제)을 보면 된다.
이렇게 초보적으로 계산하면 시간 복잡도는 O(n2)이다.
향상된 기능:
개선된 방법은 동적 기획이다. 바로 첫 번째 스캔이다. 먼저 하위 서열 [0,...,i]의 최대 이윤을 계산하고 하나의 수조로 저장하면 시간은 O(n)이다.
두 번째 단계는 역방향 스캐닝으로 하위 서열 [i,..., n-1]의 최대 이윤을 계산한다. 이 단계는 이전 단계의 결과와 결합하여 최종 최대 이윤을 계산할 수 있다. 이 단계도 O(n)이다.
그래서 마지막 알고리즘의 복잡도는 O(n)이다.
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int length = prices.size();
if(length < 2) return 0;
//profit from 0 to i
int* profitleft = new int[length];
profitleft[0] = 0;
int lowprice = prices[0];
for(int i = 1; i < length; ++i)
{
if(prices[i] > lowprice)
{
int tmp = prices[i] - lowprice;
if(tmp > profitleft[i-1])
profitleft[i] = tmp;
else
profitleft[i] = profitleft[i-1];
}else{
lowprice = prices[i];
profitleft[i] = profitleft[i-1];
}
}
//profit from i to n
int* profitright = new int[length];
profitright[length-1] = 0;
int highprice = prices[length-1];
for(int i = length-2; i >= 0; --i)
{
if(prices[i] < highprice)
{
int tmp = highprice - prices[i];
if(tmp > profitright[i+1])
profitright[i] = tmp;
else
profitright[i] = profitright[i+1];
}else{
highprice = prices[i];
profitright[i] = profitright[i+1];
}
}
//
int max = 0;
for(int i = 0; i < length; ++i)
{
int tmp = profitleft[i] + profitright[i];
if(tmp > max) max = tmp;
}
return max;
}
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int length = prices.size();
if(length < 2) return 0;
//profit from 0 to i
int* profitleft = new int[length];
profitleft[0] = 0;
int lowprice = prices[0];
for(int i = 1; i < length; ++i)
{
if(prices[i] > lowprice)
{
int tmp = prices[i] - lowprice;
if(tmp > profitleft[i-1])
profitleft[i] = tmp;
else
profitleft[i] = profitleft[i-1];
}else{
lowprice = prices[i];
profitleft[i] = profitleft[i-1];
}
}
int max = profitleft[length-1];
//profit from i to n
int* profitright = new int[length];
profitright[length-1] = 0;
int highprice = prices[length-1];
for(int i = length-2; i >= 0; --i)
{
if(prices[i] < highprice)
{
int tmp = highprice - prices[i];
if(tmp > profitright[i+1])
profitright[i] = tmp;
else
profitright[i] = profitright[i+1];
}else{
highprice = prices[i];
profitright[i] = profitright[i+1];
}
int tmpmax = profitleft[i] + profitright[i];
if(tmpmax > max) max = tmpmax;
}
return max;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
leetcode_129_Sum Root to Leaf NumbersGiven a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is th...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.