面试经典150题-6-轮转数组-力扣189

100 阅读1分钟

面试经典150题-6-轮转数组-力扣189

难度:mid

题目描述

image.png

示例

image.png

某年408数据结构大题

解法1:模拟,暴力出奇迹

一位一位的换,很显然会超时

void rotate(int* nums, int numsSize, int k) {
    // 模拟    
    k = k % numsSize;
    int temp, i, j;
    // 循环右移一位,相当于把最后一个移到第一位,后面的全部后移一位
    for(i = 0; i < k; i ++){
        temp = nums[numsSize-1];
        for(j = numsSize-1; j > 0; j --) // 后面的全部后移一位
            nums[j] = nums[j-1]; 
        nums[0] = temp;
    }
}

image.png 显然暴力的最终结果就是超时

提前将k值模一下,模完后还是会超时,焯!

解法2:数组翻转

这个思路不好想,看了题解才知道这么写的。附上链接:leetcode.cn/problems/ro…

这个大佬的图做的针不戳

第一步翻转整个数组;第二步从k处分割为两个数组;第三步两个子数组再各自翻转

// 数组reverse
void reverse(int* nums, int l, int r){
    int temp;
    while(l < r){
        // swap
        temp = nums[l];
        nums[l] = nums[r];
        nums[r] = temp;

        l++;
        r--;
    }
}

void rotate(int* nums, int numsSize, int k) {
    // 某年408的数据结构大题
    // 循环移位

    // 第一步:整体翻转
    // 7 6 5 4 3 2 1
    reverse(nums, 0, numsSize-1);
    //第二步: 从k处切割
    k = k % numsSize; // 防止k值过大
    //第三步:子数组再各自翻转
    reverse(nums,0, k-1);
    reverse(nums, k, numsSize-1);
}

时间复杂度:O(n)O(n)