leetcode189旋转数组解决——局部旋转 (C/C++/python)

发布时间 2023-10-09 22:36:35作者: 夫琅禾费米线

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

示例 1:

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

Solution:
局部旋转 时间复杂度O(n),空间复杂度O(1)

原数组
nums = [1,2,3,4,5,6,7],k=3
1.整体旋转(倒置)->[7,6,5,4,3,2,1]
2.局部旋转
左半部分(<=k)倒置 -> [5,6,7,4,3,2,1]
右半部分(>k)倒置 -> [5,6,7,1,2,3,4]
##由于python有“切片/步长”,利用nums[]=nums[start:end:step],倒置很方便
##拿result左半部分举例: nums_left[:]=nums[-k:end:1]
code:

C++
class Solution {
public:
    void reverse(vector<int>& nums,int start,int end) {
        while(start<end) {
            swap(nums.at(start),nums.at(end));
            start++;
            end--;
        }
    }
    void rotate(vector<int>& nums, int k) {
        k%=nums.size();//注意k<=sizeofnum//旋转k+n*size等同于旋转k
        reverse(nums,0,nums.size()-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.size()-1);

    }
};

python:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """

        k=k%len(nums)
        nums[:]=nums[-k:len(nums):1]+nums[0:-k:1]