leetcode热题HOT 189. 轮转数组

一、问题描述:

给定一个整数数组 nums,将数组中的元素向右轮转 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. 首先对 k 取余是为了处理 k 大于数组长度的情况,确保旋转的步数在一个周期内。
  2. 思路1,使用额外的数组空间:
    ①首先,为了避免出现数组越界问题,创建了一个长度为原数组两倍的新数组 newnums。
    ②然后,将原始数组 nums 中的元素依次复制到新数组中,同时在新数组的后半部分也复制一份原数组的内容,这样实现了循环移动的效果。
    ③最后,根据旋转后的位置,从新数组中将旋转后的元素复制回原数组 nums。
  3. 思路2,数组翻转:
    定义了一个辅助函数 reserve,该函数用来反转数组中指定范围内的元素,不需要额外空间。通过三次调用 reserve 函数,实现了数组的旋转操作:
    ①第一次调用 reserve 函数反转整个数组,在这之后,原数组中的元素顺序被颠倒。
    ②第二次调用 reserve 函数反转前 k 个元素,将前 k 个元素恢复到正确的顺序。
    ③第三次调用 reserve 函数反转剩下的元素,将剩下的元素恢复到正确的顺序。

三、代码示例:

  1. 使用额外的数组
java 复制代码
//时间复杂度为 O(n)
class Solution {
    public void rotate(int[] nums, int k) {
        k = k % (nums.length);//对k取余,右移nums.length位是原数组
        int[] newnums = new int[2*nums.length];
        for(int i = 0; i < nums.length; i++){
            newnums[i] = nums[i];
            newnums[i + nums.length] = nums[i];
        }
        for(int i = 0; i < nums.length; i++){
            nums[i] = newnums[nums.length - k + i];
        }
    }
}
  • 时间复杂度分析:
    在这段代码中,主要涉及两个循环:
    ①第一个循环用于复制原数组到新数组,时间复杂度为 O(n),其中 n 为原数组的长度。
    ②第二个循环用于将旋转后的元素复制回原数组,同样为 O(n)。
    因此,总体时间复杂度为 O(n),其中 n 为原数组的长度。空间复杂度为 O(n)。

2.数组翻转

java 复制代码
//时间复杂度为 O(n)
class Solution {
    public void rotate(int[] nums, int k) {
        k = k % (nums.length);//对k取余,右移nums.length位是原数组
        reserve(nums, 0, nums.length - 1);
        reserve(nums, 0, k - 1);
        reserve(nums, k, nums.length - 1);
    }
    public void reserve(int [] nums, int l, int r){
        while(l < r){
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l++;
            r--;
            //System.out.println(l +" "+ r );
        }
    }
}
  • 时间复杂度分析:
    在这段代码中,主要涉及了三次调用 reserve 函数,而 reserve 函数本身的时间复杂度为 O(n/2),其中 n 为待反转元素的个数。
    因此,总体时间复杂度为 O(n),其中 n 为数组的长度。空间复杂度为 O(1)。
相关推荐
成旭先生10 小时前
银行卡识别 API:一张照片读出卡号、BIN 与发卡行
人工智能·算法·ocr·api接口·金融科技·银行卡识别·支付风控
xuxigifxfh10 小时前
HJ5 进制转换
java·开发语言·华为机考
denlaku10 小时前
JDK 12 新特性详解
java·开发语言
陌上花开缓缓归以10 小时前
mebdlts3.4.1安全启动全流程
服务器·算法
用户0942485680310 小时前
第28章:JDK容器感知、cgroup与云原生JVM参数治理
java·jvm
鬼手点金10 小时前
opencode-全能开发者配置
java·linux·服务器·前端·javascript·学习·前向传播
Nebula_g10 小时前
JavaSE拓展:可变参数
java·开发语言·算法·安全·javase·可变参数
Logic10110 小时前
C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串
c语言·数据结构·字符串·枚举·时间复杂度·算法题·kmp优化
念越10 小时前
初中语数英答题与竞赛平台
java·数据库·spring boot
129Lab10 小时前
BMS 核心算法:SOC 估算从安时积分到 LSTM-UKF 串级融合的 30 年演进(附 Python 实现)
python·算法·lstm·python3.11·bms·soc估算