美文网首页LeeCode题目笔记
2019-08-29 旋转数组

2019-08-29 旋转数组

作者: Antrn | 来源:发表于2019-08-29 17:02 被阅读0次

给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。

C++ [暴力超时]
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int size = nums.size();
        int temp;
        while(--k>=0){
            temp = nums[size-1];
            for(int i=size-2;i>=0;i--){
                nums[i+1] = nums[i];
            }
            nums[0] = temp;
        }
    }
};
C++ 【O(n)通过】
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int size = nums.size();
        vector<int> res(size, 0);
        for(int i=0;i<size;i++){
            res[(i+k)%size] = nums[i];
        }
        nums.assign(res.begin(), res.end());
    }
};
C++ 【三次翻转】
class Solution {
public:
    void reverse1(vector<int>& nums, int start, int end){
        while(start >=0 &&start < end){
            int temp = nums[start];
            nums[start++] = nums[end];
            nums[end--] = temp;
        }
    }
    void rotate(vector<int>& nums, int k) {
        int size = nums.size();
        k = k%size;
        reverse1(nums, 0, size-k-1);
        reverse1(nums, size-k, size-1);
        reverse1(nums, 0, size-1);
    }
};
Java 【☆】
class Solution {
       public void rotate(int[] nums, int k) {
            if (nums.length == 0 || (k %= nums.length) == 0) {
                return;
            }
            int length = nums.length;
            int start = 0;
            int i = 0;
            int cur = nums[i];
            int cnt = 0;

            while (cnt++ < length) {
                i = (i + k) % length;
                int t = nums[i];
                nums[i] = cur;
                if (i == start) {
                    ++start;
                    ++i;
                    cur = nums[i];
                } else {
                    cur = t;
                }
            }
        }
}

相关文章

  • 2019-08-29 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 示例 2: 说明: 尽可能想出...

  • [剑指offer]08-旋转数组的最小数字

    旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...

  • 旋转数组的最小值

    旋转数组的最小值 所谓旋转数组,即是递增有序数组旋转右移动若干位得到的数组,这里的右移和java里的>>>有点不同...

  • Day6 剑指offer:旋转数字的最小数

    把一个数组最开始的若干个数组搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组...

  • 39. 恢复旋转排序数组

    给定一个旋转排序数组,在原地恢复其排序。说明:什么是旋转数组?比如,原始数组为[1,2,3,4], 则其旋转数组可...

  • 剑指Offer算法题-旋转数组的最小数字--Swift

    题目:把一个数组最开始的若干个元素搬到数组的尾部,我们称之为数组的旋转。输入一个递增数组的旋转,输出旋转数组的最小...

  • [查找和排序]旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 面试题11: 旋转数组的最小数字

    题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组...

  • 数组旋转

    数组旋转运行时限: 1000 ms 单次运行时限: 1000 ms 内存限制: 32 MB总提交: 206...

网友评论

    本文标题:2019-08-29 旋转数组

    本文链接:https://www.haomeiwen.com/subject/nntwectx.html