Skip to content

Rotate Array

题目

Given an array, rotate the array to the right by k steps, where k is non-negative.

Example 1:

Input: nums = [1,2,3,4,5,6,7], 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: nums = [-1,-100,3,99], 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]

Constraints:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

Follow up:

  • Try to come up with as many solutions as you can. There are at least three different ways to solve this problem.
  • Could you do it in-place with O(1) extra space?

思路

如例子1的,

[1,2,3,4,5,6,7] =>  [5,6,7,1,2,3,4]

实际就是将最后的3个数字5,6,7和前面的1,2,3,4做了交换;

等价于

[1,2,3,4,5,6,7] =>  [7,6,5,4,3,2,1] 1)整体翻转
将前3个(就是当前的k值)和后面的分别单独翻转
[7,6,5] => [5, 6, 7]
[4, 3, 2, 1] => [1, 2, 3, 4]

而数组翻转,只要两个指针从头尾开始,交换后,分别向中间移动,直到交叉或者会合。

代码

class Solution {
    public void rotate(int[] nums, int k) {
        int offset = k%nums.length;
        if (offset == 0) return;
        reverse(nums, 0, nums.length -1);
        reverse(nums, 0, offset-1);
        reverse(nums, offset, nums.length -1); 
    }
    
    private void reverse(int[] nums, int left, int right) {
        while(left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
}
Published in数据结构和算法

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *