题目
大致思路
将数组进行翻转,翻转3次即可实现旋转数组,以第一组例子进行示例:
nums = [1 2 3 4 5 6 7], k = 3
翻转顺序
1 2 3 4 5 6 7
第一次将数组完全翻转(0 - 最后)
7 6 5 4 3 2 1
第二次将0-2的序列翻转(0- k-1)
5 6 7 4 3 2 1
第三次将3-6的索引翻转(k - 最后)
5 6 7 1 2 3 4
结束。
代码实现
package com.immunize.leetcode.rotatearray;
/**
* 旋转数组,复杂度低于O(1)
*
* 思路:使用三次翻转即可完成旋转。
* @author Mr IMMUNIZE
*
*/
public class RotateArray {
public void rotate(int[] nums, int k) {
k %= nums.length;
//将最后k个值翻转到数组最前面
reverse(nums, 0, nums.length - 1);
//再次翻转已经被翻转到最前面的k个值,使其位置对应正确
reverse(nums, 0, k - 1);
//翻转k+1 -最后面的值,使其回到一开始的顺序
reverse(nums, k, nums.length - 1);
}
public void reverse(int[] nums, int i, int j){
while(i < j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
}
--------------------------------------------------------
//写测试class的时候出了点小bug,暂时不论,leetcode是提交通过了,明天继续加油!