旋转数组
解题思路
最容易想到的解题方法就是使用额外的数组空间,但是如果在空间复杂度为O(1)的情况下也是很好理解的,只是发现其中的规律比较难。这个规律就是进行三次数组翻转,如下图:
需要注意的是k有可能大于数组长度,所以先将k取余
c++解法
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k%=nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};
java解法
java中也有封装好的翻转函数 Collections.reverse,不过参数是List对象,所以不太适合翻转数组,只能自己编写函数来翻转。
class Solution {
public void rotate(int[] nums, int k) {
int len=nums.length;
k%=len;
reverse(nums,0,len-1);
reverse(nums,0,k-1);
reverse(nums,k,len-1);
}
public void reverse(int[] nums,int l,int r){
while(l<r){
int t=nums[l];
nums[l]=nums[r];
nums[r]=t;
l++;
r--;
}
}
}
python解法
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k%=len(nums)
self.reverse(nums,0,len(nums)-1)
self.reverse(nums,0,k-1)
self.reverse(nums,k,len(nums)-1)
def reverse(self,nums,l,r):
while l<r:
t=nums[l]
nums[l]=nums[r]
nums[r]=t
l+=1
r-=1