给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
189. Rotate Array
https://leetcode.com/problems/rotate-array/
Description
Given an array, rotate the array to the right by k steps, where k is non-negative.
Example 1:
Input: [1,2,3,4,5,6,7] and k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]
Example 2:
Input: [-1,-100,3,99] and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Could you do it in-place with O(1) extra space?
Solutions
- 首先想到的是键值对字典,改键,然后变成数组,然而怎么变来变去呢。
- 观察到旋转后的数组分为两部分,前面的平移到后面,后面的平移到前面。写吧~
啊如果数组可以切片和拼接就好了。找到了Arrays.copyOfRange
方法可以切片,然后用遍历拼接。
Submissions
我的~
class Solution {
public void rotate(int[] nums, int k) {
k=k%nums.length;
//用 Arrays.copyOfRange 方法对数组在 nums.length-k 的位置切片
int []sub1=Arrays.copyOfRange(nums,nums.length-k,nums.length);
int []sub2=Arrays.copyOfRange(nums,0,nums.length-k);
//将sub1和sub2合并成一个数组,写入[]nums
for(int i=0;i<sub1.length;i++)
nums[i]=sub1[i];
for(int i=sub1.length;i<res.length;i++)
nums[i]=sub2[i-sub1.length];
}
}
答案的~
reverse前半部分、后半部分、全部
时间复杂度:O(n) 。 n 个元素被反转了总共 3 次。
空间复杂度:O(1) 。 没有使用额外的空间。
public class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, 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++;
end--;
}
}
}
Summary
https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
我的方法和题解的方法都不一样,差不多和最后一种类似吧。但我用了额外的空间sub1和sub2。
copyOfRange的使用。