Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 ><leetcode刷题-数组> 【双指针】旋转数组

<leetcode刷题-数组> 【双指针】旋转数组

作者头像
哆哆jarvis
发布于 2022-08-23 06:13:37
发布于 2022-08-23 06:13:37
33300
代码可运行
举报
运行总次数:0
代码可运行

题目

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

思路分析

关键点:旋转

把这个数组比喻成一个圆的直径,当我们翻转180°时,令left为最左边,right为正好落在了最后边。当我们再次翻转180°,又会还原成自己。

所以针对这个数组,当我们进行2次翻转,数组里面元素的排列顺序是不会改变的,而元素的位置取决于旋转对称轴。

所以, 这里旋转的本质就是:l 和 r对调,l - 1 和r - 1对调,直到l <= r

于是,我们可以分2步

①把整个数组旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
翻转前: nums = [1,2,3,4,5,6,7]
翻转后: nums = [7,6,5,4,3,2,1]

②对数组分段旋转, 以k为分界点

a. 对0 ~ k - 1区间的元素进行翻转 [5,6,7,4,3,2,1]

b. 对k ~ numsSize - 1的元素进行翻转 [5,6,7,1,2,3,4]

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void reserve(int *nums, int l, int r, int k, int numsSize)
{
    int tmp;
    while (l < r) {
        tmp = nums[l];
        nums[l] = nums[r];
        nums[r] = tmp;
        l++;
        r--;
    }

}

void rotate(int* nums, int numsSize, int k)
{
    int left = 0;
    int right = numsSize - 3 + 1;
    int ret;
    if ((nums == NULL) || (numsSize < 1))
        return 0;
    k = k % numsSize;
    // 翻转整个数组
    reserve(nums, 0, numsSize - 1, k, numsSize);
    // 翻转前k个元素
    reserve(nums, 0, k - 1, k, numsSize);
    // 翻转剩余元素
    reserve(nums, k, numsSize - 1, k, numsSize);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哆哆jarvis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode每日一练:旋转数组
常规思路: 就是用while循环,题目要求我们轮转n次,我们就将后n个数字分别移到最前面去。这种思路虽然行得通,但是仔细想,每次将前面的数字向后移,这个时间复杂度是不低的,所以我们这里不讲这种常规思路。
利刃大大
2023/04/12
1640
leetcode每日一练:旋转数组
LeetCode 189:旋转数组 Rotate Array
Given an array, rotate the array to the right by k steps, where k is non-negative.
爱写bug
2019/07/09
4330
​LeetCode刷题实战189:旋转数组
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/03/04
2450
Leetcode No.189 旋转数组
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
week
2021/11/29
1400
Leetcode----旋转数组 ------C语言篇
🐶给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
小李很执着
2024/06/15
760
leetcode-189. 旋转数组
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
全栈程序员站长
2022/09/22
1530
力扣(LeetCode)初级算法--旋转数组
旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
程序员小涛
2020/12/03
2540
leecode刷题(3)-- 旋转数组
所以我们按照字面意思,来改变数组下标,每次让最后一位数值和前一位数值交换,然后再将最后一位数值赋值为第一位数值,让数组排序。
希希里之海
2019/01/02
4450
漫画:三次反转旋转数组
第189题:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
程序员小浩
2020/03/31
6950
189. 旋转数组
在这个方法中,我们首先将所有元素反转。然后反转前 k 个元素,再反转后面 n-k个元素,就能得到想要的结果。
Michel_Rolle
2021/02/01
2.7K0
力扣旋转字符串
题目链接:(来源于力扣)(右旋) 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1:
初阶牛
2023/03/08
3250
力扣旋转字符串
Leetcode 189. 旋转数组
输入: [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]
zhipingChen
2019/11/20
2980
【LeetCode】数组--旋转数组(189)
关注较早的读者可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的【贪心算法】已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题【数组】
PM小王
2019/07/02
4630
289.旋转数组
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
名字是乱打的
2021/12/23
2320
Swift 旋转数组 - LeetCode
例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4]。
韦弦zhy
2018/09/11
9970
【LeetCode】旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [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: 输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右
韩旭051
2020/07/02
3380
重生之“我打数据结构,真的假的?”--1.顺序表
顺序表的本质还是数组,是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
hope kc
2024/09/23
870
重生之“我打数据结构,真的假的?”--1.顺序表
消失的数字,旋转数组【LeetCode刷题日志】
此处代码就开始简化了:时间复杂度为O(N),先用上等差数列的公式求前num个数字之和,再一一减去nums数组中的元素,最后得到的就是消失的数字!
走在努力路上的自己
2024/01/26
1100
消失的数字,旋转数组【LeetCode刷题日志】
LeetCode 189. 旋转数组
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的 原地 算法。
freesan44
2020/06/03
3300
LeetCode 189. 旋转数组(环形替换)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
6310
LeetCode 189. 旋转数组(环形替换)
相关推荐
leetcode每日一练:旋转数组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档