LeetCode.189. 轮转数组

题目

题目链接

分析

首先能想到的就是可以用一个新数组,先保存原数组的后 k 个元素,再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间,那么就需要在原数组上做操作。

我们可以先把整个数组翻转一下,这样后半段元素就到了前边,前半段元素就到了后边,只不过元素顺序是反着的。我们再从 k 位置分隔开,将 [0…k−1] 区间上的元素和 [k…n−1] 区间上的元素再翻转一下,就得到了最终结果。

以 LeetCode的例1 我们来看一下这个过程:
LeetCode.189. 轮转数组_第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;
        }
    }
}

LeetCode.189. 轮转数组_第2张图片

你可能感兴趣的:(leetcode刷题,算法,java,leetcode,数据结构)