轮转数组

362 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

轮转数组

题目

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

**输入:**nums = [-1,-100,3,99], k = 2 输出: [3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]

提示:

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

进阶:

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1)原地 算法解决这个问题吗?

题目分析

这道题看似比较复杂,其实非常的简单,先将这个数组进行反转,然后从第k个位置开始,第一个数组元素到第k个数组元素进行反转,然后从第k+1个数组元素到最后一个元素进行反转,这样的数组就是我们想要的结果

代码实现

这是代码的实现:

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverseNums(nums,0 , nums.length-1);
        reverseNums(nums,0,k-1);
        reverseNums(nums,k,nums.length-1);

    }
    public void reverseNums(int[] nums,int start, int end) {
        while (start<end) {
            //交换
            int tempNum = nums[start];
            nums[start] = nums[end];
            nums[end] = tempNum;
            start +=1;
            end -=1;
        }
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉数组的元素进行反转的使用和操作。

这里的反转数组的算法是使用的双指针一个指向头一个指向尾部,然后两两交换,两个指针同时向中间移动,直到两个指针发生碰撞。

总结

我在这里介绍了数组的反转的操作,采用了双指针的思想,理解双指针也很好理解,这道题总体来说难度不大,重要的是理解双指针的思想,双指针是一个指针指向头一个指针指向尾部,然后两两交换,两个指针同时向中间移动,直到两个指针发生碰撞。这样就使用双指针解决了这个问题,双指针的思想很重要,不仅仅是反转数组,在其他题目中我们也可能会用到。

这道题先分析到这里,如果有不当之处,欢迎指正。