Leetcode面试经典150题-189.轮转数组

解法都在代码里,不懂就留言或者私信

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        /**向右轮转 1 步: [7,1,2,3,4,5,6]
           向右轮转 2 步: [6,7,1,2,3,4,5]
           向右轮转 3 步: [5,6,7,1,2,3,4]
           ....
           向右轮转 7 步: [1,2,3,4,5,6,7] */
        
        /**既然反转数组的倍数是不需要动的,那比如数组长度是6,那旋转8次就是旋转两次再旋转6次
        旋转6次不用动,那就等价于旋转2次,也就是旋转k次跟旋转k%nums.length没有区别,所以这里化简一下*/
        k = k % nums.length;
        /**按照规律,旋转数组长度的倍数是不需要动的*/
        if(k == 0) {
            return;
        }
        /**我们看每次旋转之后的结果就知道,旋转k次,比如2步,其实就是把后2个数和前面的数交换,整体次序不变
        这个我们的做法是:前面n-k个数反转,后面k个数反转,然后整体反转,比如2这种情况我们把前面5个反转,后面2个反转
        之后的结果是5 4 3 2 1 7 6然后整体反转是6 7 1 2 3 4 5,我们写一个方法来实现这个操作*/
        reverse(nums, 0, nums.length - k - 1);
        reverse(nums, nums.length - k, nums.length-1);
        reverse(nums, 0, nums.length - 1);
    }

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

算法的时间复杂度是O(N),应该算是最低时间复杂度了,但是不知道为啥没有才超过了这么点人

相关推荐
Lee川2 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i4 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有4 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有4 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫5 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫5 小时前
Handler基本概念
面试
Gorway6 小时前
解析残差网络 (ResNet)
算法
Wect6 小时前
浏览器缓存机制
前端·面试·浏览器
拖拉斯旋风6 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect6 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript