第一次运用算法思维,u1s1性能还不是很好
- 看到本题的第一想法是用类似冒牌排序的方法去寻找答案 但可惜超时了
该如何改进?- 后面一想 在数学上可以把本题转化为求极差的问题 不过必须满足出现最大值的时间在最小值之前
- 考虑到所有情况 答案可能在如下区间【最小值,最大值】【其前区间的最小值,最大值】【最小值,其后区间的最大值】【最大值,最小值 】
public:
int maxProfit(vector<int>& prices) {
int length = prices.size();
int sub_max = 0, sub_min = 0;
int max_flag = 0, min_flag = 10000;
for (int it = 0; it < length; it++) {
if (prices[it] > max_flag) {
max_flag = prices[it];
sub_max = it;
}
if (prices[it] < min_flag) {
min_flag = prices[it];
sub_min = it;
}
}
if (sub_min < sub_max) return max_flag - min_flag;
if (max_flag == min_flag) return 0;
int maxAn1 = 0, maxAn2 = 0;
for (int it = sub_min + 1; it < length; it++) {
if (prices[it] - min_flag > maxAn1) maxAn1 = prices[it] - min_flag;
}
for (int it = sub_max - 1; it >= 0; it--) {
if (max_flag - prices[it] > maxAn2) maxAn2 = max_flag - prices[it];
}
int maxAn = max(maxAn1, maxAn2);
int record = 0;
for (int site = sub_max + 1 ; site < sub_min - 1; site++) {
for (int temp = site + 1; temp < sub_min ; temp++) {
if (prices[temp] - prices[site] > record) record = prices[temp] - prices[site];
}
}
return max(record, maxAn);
}
};
---
更新一下 发现自己着实太蠢了之前🤣
其实真正重要的是什么呢?
==记录下该天之前的最低点 注意不断更新最低点与所求值即可==
class Solution {
public:
int maxProfit(vector<int>& prices) {
int min_flag = 1e5, maxAn = 0;
for (int temp : prices) {
if (temp - min_flag > maxAn) maxAn = temp - min_flag;
if (temp < min_flag) min_flag = temp;
}
return maxAn;
}
};