(leetcode)189. 轮转数组

简介: (leetcode)189. 轮转数组

方法1:暴力解法

每次向右旋转一个元素,用tem储存最后一个元素,最后赋值给下标为0的位置,重复k次即可。

时间复杂度O(n^2)

空间复杂度O(1)

void rotate(int* nums, int numsSize, int k){
    //重复k次
    while(k--)
    {
        //保存最后一个元素的值
        int tem = nums[numsSize-1];
        //将前numsSize-1个元素向后移一位
        for(int i =numsSize - 1;i>0;i--)
        {
            nums[i] = nums[i-1];
        }
        //把最后的元素赋给第一个位置
        nums[0]=tem;
    }
    return nums;
}

此代码会运行超时

方法2 :借助一个新数组

算法思想:声明一个新数组arr[],nums = [1,2,3,4,5,6,7], k = 3,输出[5,6,7,1,2,3,4],其实就是在nums[numsSize-1]的位置开始循环赋值,直到下标为numsSize-2时结束.

时间复杂度O(n)

空间复杂度O(n)

void rotate(int* nums, int numsSize, int k){
    //申请一个新数组
    int* arr =(int *)malloc(sizeof(int)*(numsSize));
    //起始下标
    int index =numsSize-k%numsSize; 
    int i = 0;
    //i指向新数组下标,新数组满了,即为旋转完成
    for(i = 0;i<numsSize;i++)
    {
        arr[i] = nums[(index%numsSize)];
        index++;
    }
    //还要必须返回原来的数组
    for(i = 0;i<numsSize;i++)
    {
        nums[i]=arr[i];
    }
    return nums;
}

方法3:技巧

假如有[1,2,3,4,5,6,7]这样一个数组 k = 3

先将前numsSize-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(n)

此方法面试常考,需要熟悉

//逆置区间为left-right的元素
void reverse(int *nums,int left,int right)
{
    while(left<right)
    {
        int tem =nums[right];
        nums[right] = nums[left];
        nums[left] = tem;
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k){
    k = k%numsSize;
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
    return nums;
}

以上为轮转数组的题解,如有问题,欢迎在评论区讨论💞

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