结果
代码:
class Solution {
public void rotate(int[] nums, int k) {
if(nums==null||nums.length<=1||k<=0){
return;
}
int n = nums.length;
k %= n;
reverse(nums,0,n-k-1);
reverse(nums,n-k,nums.length-1);
reverse(nums,0,nums.length-1);
}
public void reverse(int[] nums,int start, int end){
int temp;
int len = (end-start+1)/2;
for(int i = 0;i < len;i++){
temp = nums[end-i];
nums[end-i] = nums[start+i];
nums[start+i] = temp;
}
}
}
思路
待移动数组:[1,2,3,4,5,6,7] , n = 7, k = 3
移动后数组:[5,6,7,1,2,3,4]
其实就是分了三步走,首先从整体上将数组分为两个部分,第一部分是移动到数组末尾的部分,即为1,2,3,4,另一部分为需要移动到数组前面的,即为5,6,7。这里提一个现象,也是后文的思路,1,2,3,4其实就是需要移动到后面的位置,如果1,2,3,4反转一下为4,3,2,1,这时候看一下整体数组的情况[4,3,2,1,5,6,7],如果通过整体数组的反转,数组正好为[7,6,5,1,2,3,4],并且1,2,3,4反转后留出了前面5,6,7需要的位置,我们只需要把5,6,7按照同样的方法先反转一下就好了,当然5,6,7可以先反转,也可以在数组整体反转后再反转。
- 将数组前部1,2,3,4反转为4,3,2,1
- 将数组后部5,6,7反转为7,6,5
- 将数组整体反转
这个思路好处就是切割了,如果采用最傻的方法无非就是把数组看成一个循环数组,然后进行循环移动,这样如果做优化的话比较复杂,考虑情况比较多,那么此方法将数组进行分割,相当于去除了“循环”的复杂性。