牛客题霸 NC7 买卖股票的最好时机(一)
- 思路:一般,我们最直观的可以想到暴力,两重循环,在i天的时候,(第二重for循环)遍历寻找前面i - 1天中的最小值(就是买入的时机),与第i天的价值相减就是收益,再比较收益,实时更新获取最大值;但是我们仔细想想在这个过程中,是不是做了很多重复的操作,就是在寻找最小值时,这一部分我们有些值重复比较了好多次;所以优化的方法是:实时更新最小值,将最小值记录下来,再去求每个i天的最大收益的比较,具体可以看代码
class Solution {
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
// 关键思路:找到第i个点之前的最小值,用当前点减去这个最小值(买入),就得到收益
// 而在重复的这个过程中,不断的选择出最大收益,实时更新
int maxProfit(vector<int>& prices) {
// write code here
int minBuyin = prices[0]; // 循环到0 ~ i-1的最小值
int maxAll = 0;// 最大收益
int len = prices.size();
for (int i = 1; i < len; ++i) {
minBuyin = min(minBuyin, prices[i]); // 实时更新最小值
maxAll = max(maxAll, prices[i] - minBuyin);
}
return maxAll;
}
};
牛客题霸 NC 103 反转字符串
- 解法一:利用额外空间,来反转(这里不提);
- 解法二:原地反转:
- 解法三:利用自带的库函数:reverse(begin(), end())
class Solution {
public:
/**
* 反转字符串
* @param str string字符串
* @return string字符串
*/
string solve(string str) {
// write code here
// int len = str.length();
// for (int i = 0; i < len / 2; ++i) {
// // char c = str[i];
// // str[i] = str[len - i - 1];
// // str[len - i - 1] = c;
// swap(str[i], str[len - 1 - i]);
// }
reverse(str.begin(), str.end());
return str;
}
};