目录
前言
一,思路
1)暴力求解 O(N^2)
2)三段逆置
二,代码实现
前言
随着C语言的深入,我们准备转向C++方面学习,学习C++之前我们需要搞懂时间复杂度,这个蛮重要的,我们将通过几个题来了解什么是时间复杂度以及为什么会有这个概念的出现,这对我们做题以及竞赛会很有帮助。
依旧是力扣上的一道题,我们将用不同时间复杂度的方式来进行求解,,让我们看看两种方法的不同之处。
189. 轮转数组 - 力扣(LeetCode)https://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写的代码所以还是要定义一下这个逆置函数,不过主体就简单了
🎈🎈完结撒花🎈🎈