题目
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(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,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
想法:
1、两重循环,类似于冒泡。超时了
2、多次翻转数组。
翻转整个数组
list.reverse()
翻转索引 【0】…【k-1】
nums[0:k] = reversed(nums[0:k])
翻转索引 【k】 …【n-1】
nums[k:n] = reversed(nums[k:n])
方法1
Python实现
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k=k%n
nums.reverse()
nums[0:k] = reversed(nums[0:k])
nums[k:n] = reversed(nums[k:n])
Java实现
class Solution {
public void rotate(int[] nums, int k) {
// 更新k值
int new_k = k % nums.length;
// 翻转
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, new_k - 1);
reverse(nums, new_k, nums.length - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
}
方法2
1、先用一个res的数组存变化后的数组
2、用 System.arraycopy()函数,将变化后的数组拷贝给原数组。
Java实现
class Solution {
public void rotate(int[] nums, int k) {
int n=nums.length;
k=k%n;
int[] res=new int[nums.length];
int flag=0;
for (int i=0; i<n; i++){
if (i<n-k){
res[k+i]=nums[i];
}else{
res[flag]=nums[i];
flag++;
}
}
System.arraycopy(res,0,nums,0,n);
}
}