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

简介: 【双指针】旋转数组

题目

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

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3

输出:[5,6,7,1,2,3,4]

思路分析

关键点:旋转

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

640.png

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

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

于是,我们可以分2步

①把整个数组旋转

翻转前: 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]

代码实现

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);}

号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。

如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】

一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~

相关文章
|
27天前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
28天前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
63 2
|
1月前
|
Python
【Leetcode刷题Python】53. 最大子数组和
LeetCode第53题"最大子数组和"的Python解决方案,利用动态规划的思想,通过一次遍历数组并维护当前最大和以及全局最大和来求解。
48 2
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 03. 数组中重复的数字
解决剑指Offer题目 "数组中重复的数字" 的Python实现方法,通过使用字典来记录数组中每个数字的出现次数,快速找出重复的数字。
26 1
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
28天前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
27天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
19天前
|
搜索推荐 C语言
指针与数组
指针与数组
47 9
|
27天前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。