LeetCode算法题-Rotate Array(Java实现)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Rotate Array(Java实现)

这是悦乐书的第184次更新,第186篇原创

01 看题和准

今天介绍的是LeetCode算法题中Easy级别的第43题(顺位题号是189)。给定一个数组,将数组向右旋转k步,其中k为非负数。例如:

输入:[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]

输入:[ - 1,-100,3,99],k = 2

输出:[3,99,-1,-100]

说明:

向右旋转1步:[99,-1,-100,3]

向右旋转2步:[3,99,-1,-100]

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

我们先看下原数组依次旋转7步的结果

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

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

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

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

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

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

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

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

我们可以发现旋转是有周期性的,周期是数组的长度,所以数组反转的次数是可控制的,只需旋转k对数组长度取余数次即可。

最直接的办法就是使用两层循环,外层控制旋转次数,内层控制元素交换位置。


public void rotate(int[] nums, int k) {
    if (k % nums.length != 0) {
        int pre, tem;
        for (int i=0; i  k % nums.length; i++) {
            pre = nums[nums.length-1];
            for (int j=0; jnums.length; j++) {
                tem = nums[j];
                nums[j] = pre;
                pre = tem;
            }
        }
    }
}

此解法时间复杂度为O(n*k),空间复杂度为O(1)。

03 第二种解法

新建一个大小和nums一样的数组,然后将旋转后的元素放入新的数组中,再遍历新数组赋值给nums。新数组的元素从nums的长度先减去k再加上i开始,直到i不小于k为止,这些元素是需要拿到数组前面去的。当i大于等于k时,新数组的元素要从nums的第1位开始,也就是将原数组前面的元素放到后面来。

对于k的值,先判断对数组长度取余是否等于0,不等于0后才会开始下一步操作。


public void rotate2(int[] nums, int k) {
    if (k % nums.length != 0) {
        k = k % nums.length;
        int pointer = 0;
        int[] tem = new int[nums.length];
        for (int i=0; i  tem.length; i++) {
            if (ik) {
                tem[i] = nums[tem.length-k+i];
            } else {
                tem[i] = nums[pointer++];
            }
        }
        for (int j=0; jnums.length; j++) {
            nums[j] = tem[j];
        }
    }
}

此解法的时间复杂度是O(n),空间复杂度是O(n),因为使用了新的数组。

04 第三种解法

先通过一个小例子来说明:

nums = {1,2,3,4,5,6,7},k = 3,

先反转其全部元素,变成{7,6,5,4,3,2,1}

再反转前3个元素,变成{5,6,7,4,3,2,1}

再反转后4个元素,变成{5,6,7,1,2,3,4}

这样就能够得到答案了。


public void rotate3(int[] nums, int k) {
    if (k % nums.length != 0) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
}

public void reverse(int[] nums, int start, int end) {
    while (start  end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

此解法的时间复杂度是O(n),空间复杂度是O(1)。

05 小结

算法专题目前已连续日更超过一个月,算法题文章43+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Rotate Array(Java实现)

可能你还想看:

原文始发于微信公众号( 悦乐书 ):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Rotate Array(Java实现)


 上一篇
LeetCode算法题-Reverse Bits(Java实现) LeetCode算法题-Reverse Bits(Java实现)
这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190)。给定32位无符号整数,求它的反转位。例如: 输入:43261596 输出:964176192 说明
2021-04-05
下一篇 
LeetCode算法题-Excel Sheet Column Number LeetCode算法题-Excel Sheet Column Number
这是悦乐书的第182次更新,第184篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第41题(顺位题号是171)。给定Excel工作表中显示的列标题,返回其对应的列号。例如: A - 1 B - 2 C -
2021-04-05