图解LeetCode——189. 轮转数组

简介: 图解LeetCode——189. 轮转数组

一、题目

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

二、示例

2.1> 示例 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.2> 示例 2:

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

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

解释

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

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

提示:

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

三、解题思路

3.1> 数组拷贝方式

根据题目描述,我们需要根据给定的k的值去轮转数组,如果我们将数组nums看做是一个无限长的数组的话,其实这种轮转操作,就相当于每个nums数组中的元素都向右移动了k个位置。但是由于nums的数组长度是有限的,所以被移动越界的数组就会被移动到原数组的头部位置。根据这个规则,我们假设nums = [1,2,3,4,5,6,7], k = 3,通过每个元素的移动,来找移动的规律:

index=0】数字1移动到index=3的位置

index=1】数字2移动到index=4的位置

index=2】数字3移动到index=5的位置

index=3】数字4移动到index=6的位置

index=4】数字5移动到index=0的位置

index=5】数字6移动到index=1的位置

index=6】数字7移动到index=2的位置

通过上面的移动方式,我们可以找到如下规律,即:result[(i + k) % nums.length] = nums[i];

3.2> 翻转数组

通过上面解法,我们发现必须要创建一个同等长的数组result,然后按位映射进行元素的复制操作。这样的空间复杂度就会比较高。有没有一种方式,可以在原数组基础上进行操作呢?

我们可以先将原数组nums进行翻转操作,即:将nums = [1,2,3,4,5,6,7],翻转为nums = [7,6,5,4,3,2,1],然后再按照k值进行“切分”操作,并对“切分”后的前后两部分数组再分别执行翻转操作。那么执行完毕后就是最终的结果啦。具体操作,请见下图所示:

四、代码实现

4.1> 数组拷贝方式

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] result = new int[nums.length];
        for (int i = 0; i < nums.length; i++)
            result[(i + k) % n] = nums[i];
        System.arraycopy(result, 0, nums, 0, n);
    }
}

4.2> 翻转数组

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length, nk = k % n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, nk - 1);
        reverse(nums, nk, n - 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^)/ ~ 「干货分享,每天更新」

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
519 1
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
489 4
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
477 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
352 0
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
479 1
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
573 2
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
470 0
【Leetcode刷题Python】73. 矩阵置零
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
293 1
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
218 3
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
279 1