手撕C语言题典——轮转数组

目录

前言

一,思路 

1)暴力求解 O(N^2)

2)三段逆置 

 二,代码实现


前言

     随着C语言的深入,我们准备转向C++方面学习,学习C++之前我们需要搞懂时间复杂度,这个蛮重要的,我们将通过几个题来了解什么是时间复杂度以及为什么会有这个概念的出现,这对我们做题以及竞赛会很有帮助。

   依旧是力扣上的一道题,我们将用不同时间复杂度的方式来进行求解,,让我们看看两种方法的不同之处。

189. 轮转数组 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/description/

题目很简单,我们只需要将所给数据旋转

我们要考虑它的时间复杂度的多种情况,通过样例我们可以看出真实的旋转次数:K% = N

所以:

时间复杂度:O(N*K)

最坏情况:K%N等于N-1  -> O(N^2)

最好情况:K%N等于0

一,思路 

1)暴力求解 O(N^2)

     但我们尝试写出这个代码并且提交的时候会发现结果超出时间限制了,贴一下我的笔记大家可以参考一下代码:

2)三段逆置 

要知道这个方法的时间复杂度我们需要简单了解一下这个方法的思路:

  • 前 n-k 个逆置

  • 后 k 个逆置

  • 整体逆置

简单来看分三步其实算两次,所以时间复杂度应该是O(n),用样例来模拟一下:

 二,代码实现

void reverse(int *a,int left,int right)
{
    while(left<right){
        int tmp = a[left];
        a[left] = a[right];
        a[right] = tmp;
        ++left;
        --right;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;
    reverse(nums,0,numsSize-k-1);
    reverse(nums,numsSize-k,numsSize-1);
    reverse(nums,0,numsSize-1);
}

   因为用的C写的代码所以还是要定义一下这个逆置函数,不过主体就简单了

    🎈🎈完结撒花🎈🎈  

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值