leetcode - 旋转数组

题目描述:

       给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

       示例:

输入: [1,2,3,4,5,6,7]k = 3输出: [5,6,7,1,2,3,4]解释:
向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

❗解决思路❗:

? 1、刚开始,按照解释的步骤一步步走,基础例子能通过,但数组长度非常之大时,会超时。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        for (int i = 0; i < k; ++i)
        {
            int temp = nums[nums.size()-1];
            for (int j = nums.size() - 1; j > 0; --j)
            {
                nums[j] = nums[j-1];
            }
            nums[0] = temp;
        }
        
    }
};

 ? 2、这道题可以找一找规律,走 k 步的结果是什么呢?我们可以看到,走 k 步后,数组后 k 个数走到了数组的最前面,其余的数字依次后移。想一想,也就是说,数组的前 k 个数变成了数组的后 k 个数,且不考虑这 k 个数的顺序,我们怎么可以做到这一点呢?就是把数组整体翻转。 ( [1, 2, 3, 4, 5, 6, 7] → [7, 6, 5, 4, 3, 2, 1] )

       经过上面的步骤后,我们发现,前 k 个数和后面 len-k 个数,其顺序完全颠倒,所以我们又可以将前 k 个数进行一次翻转,后 len-k 个数进行一次翻转。( [7, 6, 5, 4, 3, 2, 1] → [5, 6, 7, 1, 2, 3, 4] )

       题目中已经说了 k 是非负数,所以我们不需要考虑这种情况了。但还有一点要注意,k 的大小和数组长度 len 的大小关系,所以在进行翻转之前,先要进行一步运算:k = k % nums.size()

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        //reverse(nums, 0, nums.size()-1);
        //reverse(nums, 0, k-1);
        //reverse(nums, k, nums.size()-1);
        // 防止 k > nums.size()
        k = k % nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin()+k, nums.end());

        return;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值