leetcode189旋转数组解决——局部旋转 (C/C++/python)
给定一个整数数组 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]
nums = [1,2,3,4,5,6,7],k=3
Solution:
局部旋转 时间复杂度O(n),空间复杂度O(1)
原数组
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]