【数据结构-3】算法美学之降复杂度

这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣轮转数组,听完讲解后,大家可以动手试试。首先,上题目描述:

解法一:

c 复制代码
void rotate(int* nums, int numsSize, int k) {
    while(k--)
    {
        int tmp = nums[numsSize-1];
        for(int i = numsSize - 1; i > 0; i--)
        {
            nums[i] = nums[i-1];
        }
        nums[0] = tmp;
    }
 
}

在方法一中,需要轮转几个位置,就需要while循环几次,每次轮转一个位置。在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。

时间复杂度为O(n²),空间复杂度为O(1)。

解法二:

c 复制代码
void rotate(int* nums, int numsSize, int k) {
    int newArr[numsSize];
    
    for(int i = 0; i < numsSize; i++)
    {
        newArr[(i+k)%numsSize] = nums[i];
    }
 
    for(int i = 0; i < numsSize; i++)
    {
        nums[i] = newArr[i];
    }
}

方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这里巧妙地利用到了取余操作 。最后把新数组中所有的数据移动到原数组中。

时间复杂度为O(n),空间复杂度为O(n) ,属于空间换时间的操作。

解法三:

c 复制代码
void reverse(int* nums,int left,int right)
{
    while(left < right)
    {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;

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

首先介绍方法三的时间复杂度为O(n),空间复杂度为O(1) 。

这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。

相关推荐
机器人零零壹5 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi8 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是9 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考9 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt11 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one13 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼13 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记14 小时前
C++ 智能指针的使用及其原理详解
c++·算法