189.轮转数组、 121.买卖股票的最佳时机

在这里插入图片描述
在这里插入图片描述

  • 解题思路:

1.常见的方法也是用数组,一轮改变一个元素,也就是每一轮将元素往后推一位,推k轮即可。
2 但这种方式做了很多无用功,简化一下就可以变成:将元素向右移动k个位置,那可以先将后k个元素拿出来放入一个新的数组中,然后将前(n - k )个元素向后移动k个距离,最后将新数组中的元素复制到原数组的前k个位置中。
3. 这也是我最推荐的方法。具体思路可以参考翻转数组。其实就是先将整个数组进行反转,然后将整个数组分成2个部分,前k个数字为一个部分,后(n - k)个数字为一个部分。再分别将两个部分内部进行反转,这样你发现是不是就完成了本题了。并且三个反转部分代码及其相似,所以可以使用函数来封装这一部分代码。

  • 具体代码如下:
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size(), kn = k % n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, kn - 1);
        reverse(nums, kn, n - 1);
    }

    void reverse(vector<int>& nums, int start, int end) {
        while(start < end) {
            int num = nums[start];
            nums[start] = nums[end];
            nums[end] = num;
            start++;
            end--;
        }
    }
};

121、买卖股票的最佳时机
在这里插入图片描述

  • 题解:
    二维数组进行暴力求解当然也可以,但是会运行时间超时,所以我们来看一种比较简单的方式。我们当天选择卖出手中的股票,然后计算今天以前的股票最低点,最后将两者相减,得出正确答案,这样也就不用考虑卖出的实践早于买入的时间。代码如下:
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //假设今天卖出股票,然后计算今天之前的股票最低点
        int min1 = 1e9;
        int minprice = min1, maxprofit = 0;
        for(int price : prices) {
            maxprofit = max(maxprofit, price - minprice);
            minprice = min(price, minprice);
        }
        return maxprofit;
    }
};
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值