文档章节

leetcode 189. 旋转数组(Rotate Array)

o
 osc_fmg49rzg
发布于 2019/03/20 14:01
字数 434
阅读 16
收藏 0

精选30+云产品,助力企业轻松上云!>>>

[TOC]

题目描述:

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

示例 1:

    输入: [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]

示例 2:

    输入: [-1,-100,3,99] 和 k = 2
    输出: [3,99,-1,-100]
    解释: 
        向右旋转 1 步: [99,-1,-100,3]
        向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(1) 的原地算法。

算法:

class Solution {
public:
    void rotate1(vector<int>& nums, int k){
        // method 1
        int sz = nums.size();
        if(k <= sz/2){
            for(int i = 0; i < k; i++){
                // for the i-th step
                int pre = nums[sz-1];
                for(int j = sz - 1; j > 0; j--){
                    nums[j] = nums[j-1];
                }
                nums[0] = pre;
            }
        }else{
            k = sz - k;
            for(int i = 0; i < k; i++){
                // for the i-th step
                int pre = nums[0];
                for(int j = 0; j < sz - 1; j++){
                    nums[j] = nums[j+1];
                }
                nums[sz - 1] = pre;
            }
        }
        
    }
    
    int gcd(int a, int b){
        int c = a;
        while(a % b){
            c = a % b;
            a = b;
            b = c;
        }
        return b;
    }
    
    void rotate2(vector<int>& nums, int k){
        // method 2
        int sz = nums.size();
        int cycle = gcd(sz, k);
        int _sz = sz / cycle;
        for(int i = 0; i < cycle; i++){
            int val = nums[i];
            int idx = i;
            int pre = 0;
            for(int j = 0; j < _sz-1; j++){
                pre = (idx + sz - k)%sz;
                nums[idx] = nums[pre];
                idx = pre;
            }
            nums[idx] = val;
        }
    }
    
    void flip(vector<int>& nums, int start, int end){
        while(start < end){
            swap(nums[start++], nums[end--]);
        }
    }
    
    void rotate3(vector<int>& nums, int k){
        // method 3
        // target: move the last k elements to the front
        // 1. flip the whole vector
        // 2. flip the first k elements
        // 3. flip the rest of elements
        int sz = nums.size();
        flip(nums, 0, sz-1);
        flip(nums, 0, k-1);
        flip(nums, k, sz-1);
    }
    
    void rotate(vector<int>& nums, int k) {
        int sz = nums.size();
        if(sz <= 1){
            return ;
        }else{
            k %= sz;
        }
        if(k == 0){
            return ;
        }
        // rotate1(nums, k);   // time limited
        rotate2(nums, k);   // accept
        // rotate3(nums, k);   // accept
    }
};
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

物联网开发服务开发虚拟设备需要几步?

云栖号快速入门:【点击查看更多云产品快速入门】 不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 物联网平台设备的正常开发流程是:设备端开发完成,设备上报...

osc_2axit9df
4分钟前
0
0
互联网互联网必看文章墙裂推荐

后端必看文章系列 大型项目架构演进过程及思考的点

code-ortaerc
5分钟前
11
0
ACL2020论文整理 - 知乎

ACL2020录取文章已经放出,链接如下: ACL2020论文集合 www.aclweb.org 为了以后更加方便地阅读论文,也本着一颗开源之心,花一个下午的时间整理了一下相关论文。鉴于本人精力有限,并且也只...

osc_5w65ebjo
6分钟前
0
0
SU(N) Hubbard 模型平均场

osc_31d5oo2i
7分钟前
0
0
Python语言及其应用PDF高清完整版百度云盘免费下载|python基础教程PDF电子书推荐

编辑推荐 本书内容易于理解,而且读起来生动有趣,是编程和Python初学者不可多得的教程。书中首先介绍了Python的基础知识,然后逐渐深入多种主题,结合教程和攻略式风格来讲解Python 3中的概...

osc_nbg2lo7i
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部