题目
题目链接
分析
首先能想到的就是可以用一个新数组,先保存原数组的后 k 个元素,再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间,那么就需要在原数组上做操作。
我们可以先把整个数组翻转一下,这样后半段元素就到了前边,前半段元素就到了后边,只不过元素顺序是反着的。我们再从 k 位置分隔开,将 [0…k−1] 区间上的元素和 [k…n−1] 区间上的元素再翻转一下,就得到了最终结果。
以 LeetCode的例1 我们来看一下这个过程:
代码
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);}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;}}
}