力扣-189.轮转数组

本文旨在记录我的解题思路与思考过程(部分解法参考了其他优秀题解,参考来源已附文末),作为个人学习笔记以便后续复习回顾。文中如有疏漏或不足之处,欢迎指正交流。

一. 题述:

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

二. 解题思路:

2.1 理解题意:

题意很好理解:

  • 每次轮转,数组的最后一个元素移动到第一个位置,其余元素向后移动一位。(轮转 k 次 = 重复上述操作 k 次)
  • ​直接修改原数组​​(就地轮转),而不是返回新数组。

2.2 解题步骤:

我看到这道题首先想的就是暴力轮转​(时间复杂度 O(nk)),但是太耗时了,最后并未通过。然后学习了官方题解的使用额外的数组(时间复杂度 O(n))以及数组翻转(时间复杂度 O(n))。具体如何实现请参考官方题解(链接放在文章末尾)。

三. 解题算法:

3.1 暴力轮转(不推荐)

3.1.1 基于Python3编写

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        ## 暴力轮转(时间复杂度太高 O(nk))
        for _ in range(k):
            for i in range(len(nums) - 1, 0, -1):
                a = nums[i - 1]
                nums[i - 1] = nums[i]
                nums[i] = a

3.1.2 基于Java编写

class Solution {
    public void rotate(int[] nums, int k) {
        for (int i = 0; i < k; i++) {
            for (int j = nums.length - 1; j >= 1 ; j--) {
                int a = nums[j - 1];
                nums[j - 1] = nums[j];
                nums[j] = a;
            }
        }
    }
}

3.2 使用额外的数组(推荐)

3.2.1 基于Python3编写

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        ### 使用额外的数组(O(n))
        n = len(nums)
        newArr = [0 for _ in range(n)]
        for i in range(n):
            newArr[(i + k) % n] = nums[i]
        nums[:n] = newArr[:n]

3.2.2 基于Java编写

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; i++) {
            newArr[(i + k) % n] = nums[i];
        }
        // 将 newArr 数组复制到 nums
        System.arraycopy(newArr, 0, nums, 0, n);
    }
}

3.3 数组翻转(推荐)

3.3.1 基于Python3编写

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        ### 反转数组
        n = len(nums)
        self.reverse(nums, 0, n - 1)
        self.reverse(nums, 0, k % n - 1)
        self.reverse(nums, k % n, n - 1)
    # 就地反转
    def reverse(self, arr: List[int], L: int, R: int):
        while L < R:
            a = arr[L]
            arr[L] = arr[R]
            arr[R] = a
            L = L + 1
            R = R - 1

3.3.2 基于Java编写

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k % n - 1);
        reverse(nums, k % n, n - 1);
        }
    public void reverse(int[] arr, int L, int R) {
        while (L < R) {
            int a = arr[L];
            arr[L] = arr[R];
            arr[R] = a;
            L = L + 1;
            R = R - 1;
        }
    }
}

​​版权声明​

本文部分解题思路和代码实现参考自 LeetCode 官方题解《189. 轮转数组》(https://leetcode.cn/problems/rotate-array/solutions/551039/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/),所有引用内容仅供学习交流使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值