力扣-189.轮转数组

题目描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
进阶:

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

class Solution {
public:
    void reverse(vector<int>& nums, int start, int end){
        for (int i = start; i < start+(end-start+1)/2; ++i) {
            int temp = nums[i];
            nums[i] = nums[end-i+start];
            nums[end-i+start] = temp;
        }
    }
    void rotate(vector<int>& nums, int k) {
        if(k>nums.size()){
            k=k%nums.size();
        }
        reverse(nums,0,nums.size()-k-1);
        reverse(nums,nums.size()-k,nums.size()-1);
        reverse(nums,0,nums.size()-1);
    }
};

小结:第一种方法最简单也是最容易想到的是辅助数组,空间换时间;第二种方法是环状替换,只用一个单元存储被替换的值,难点是需要记录和判断什么时候结束;这里只写了第三种,也是最经典的,通过三次翻转完成轮转,需要注意的是样例中k可能大于数组长度,取模防止越界

你可能感兴趣的:(力扣hot100,leetcode,算法)