Leetcode每日一题——“轮转数组”

简介: Leetcode每日一题——“轮转数组”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是轮转数组,下面,让我们进入轮转数组的世界吧


小雅兰之前其实就已经写过了字符串旋转的问题了:

C语言刷题(7)(字符串旋转问题)——“C”_认真学习的小雅兰.的博客-CSDN博客

49c202270fab4cbd8f90659156097152.png

示例 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]

efd88348f6724974877168c7abd72be8.png

方法一:

暴力求解法,旋转k次

但是,这样求解时间复杂度为O(N^2),空间复杂度为O(1)

不符合题目要求

那么此方法,小雅兰就不用代码来实现啦

方法二:


三步翻转法


原数组:1 2 3 4 5 6 7


前n-k个逆置:4 3 2 1 5 6 7


后k个逆置:4 3 2 1 7 6 5


整体逆置:5 6 7 1 2 3 4


时间复杂度为O(N),空间复杂度为O(1)


满足题目要求

void reverse(int* arr,int left,int right)
{
    while(left<right)
    {
        int tmp=arr[left];
        arr[left]=arr[right];
        arr[right]=tmp;
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k)
{
 if(k>numsSize)
 {
     k%=numsSize;
 }
 reverse(nums,0,numsSize-1-k);
 reverse(nums,numsSize-k,numsSize-1);
 reverse(nums,0,numsSize-1);
}

方法三:

空间换时间的方法

使用额外的数组来将每个元素放至正确的位置

不能用strcpy,strcpy是专门处理字符串的函数

e36c464d89a74c409641755887463777.png

void rotate(int* nums, int numsSize, int k){
 if(k>numsSize)
 {
     k%=numsSize;
 }
 int*tmp=(int*)malloc(sizeof(int)*numsSize);
 memcpy(tmp+k,nums,sizeof(int)*(numsSize-k));
 memcpy(tmp,nums+numsSize-k,sizeof(int)*(k));
 memcpy(nums,tmp,sizeof(int)*(numsSize));
 free(tmp);
 tmp=NULL;
}

9a3776376f524591898927e21aefb2a7.png

好啦,小雅兰今天的轮转数组就到这里啦,还要继续加油刷题噢!!!

783af0cc1440457eaea24a9b32d9d6ee.jpg

相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
55 0
|
5月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
3月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
31 4
|
3月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
30 0
Leetcode第三十三题(搜索旋转排序数组)
|
3月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
82 0
|
3月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
28 0
|
5月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
5月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
5月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组