牛客题霸 NC7 买卖股票的最好时机(一)和 牛客题霸 NC 103 反转字符串

117 阅读1分钟

牛客题霸 NC7 买卖股票的最好时机(一)

maimai

  • 思路:一般,我们最直观的可以想到暴力,两重循环,在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;

    }
};