LeetCode 189. 旋转数组(翻转数组;环形替换)

2021年04月15日 周四 天气大风 【不悲叹过去,不荒废现在,不惧怕未来】



1. 题目简介

189. 旋转数组
在这里插入图片描述

2. 题解

2.1 开辟新数组复制

将原数组下标为 i 的元素放至新数组下标为 (i+k) mod n 的位置。

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

2.2 三次翻转

主要掌握翻转函数_reverse()的书写。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();
        _reverse(nums.begin(),nums.end());
        _reverse(nums.begin(),nums.begin()+k);
        _reverse(nums.begin()+k,nums.end());
    }
-
    void _reverse(vector<int>::iterator begin, vector<int>::iterator end){
        while(begin!=end && begin!=--end){
            swap(*begin,*end);
            ++begin;
        }
    }
};

2.3 环形替换

唯一需要注意的是:如果nums.size() % k = 0,也就是数组长度为 k 的倍数,还没完成替换就会原地打转。只要判断一下当前替换位置 next 是否回到了原来的 i 位置上即可,回到了则说明出现了循环,直接 break 。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size(), cnt = 0;
        k = k % n;
        for(int i=0;i<n;++i){
            int tmp = 0, pre = nums[i], next = i;
            // 循环进行替换
            while(1){
                next = (next + k) % n;
                tmp = nums[next];
                nums[next] = pre;
                pre = tmp;

                // 最多循环 n 次,就能够完成所有移动
                if(++cnt==n) return;
                // 回到了当前位置,说明出现循环了,break
                if(next==i) break;   
            }
        }
    }
};

参考文献

https://leetcode-cn.com/problems/rotate-array/solution/javadai-ma-3chong-fang-shi-tu-wen-xiang-q8lz9/

https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值