一.前言
前不久学习了时间复杂度的概念,便在力扣上刷了一道需要参考时间复杂度的题——轮转数组
https://leetcode.cn/problems/rotate-array/submissions这道题不能使用暴力算法,因为这道题对时间复杂度的要求不能为O(N^2)。因此我们只能使用其他,简便的方法过关。
二.正文
1.1题目描述
1.2暴力算法(思想对,但是不能通过该题)
看到题目,你可能会想通过双重循环将数字一个个遍历到相应位置,这个思路并没有错,只是答案并不能跑过,因为这个方法的时间复杂度是O(N^2),很明显不符合题目要求。如果你想要看,以这个方法在力扣上该如何显示,请看VCR:
虽然能运行,但是不符合题目要求,因此它才显示只通过37个用例,但其实解题思想是没有问题的。
1.3分段逆置
该方法的的思想是:将一组数据,分段逆置,最后再将整个数据进行逆置。好吧,我知道这样讲确实太抽象了。
对于内部的逆转是这样的:
其他的与上面一样的逆转原理。
以下是源代码
void spin(int *nums,int left,int right)
{
while(right>left)
{
int tmp=nums[right];
nums[right]=nums[left];
nums[left]=tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
int n=numsSize;
k=k%n;
spin(nums,0,n-k-1);
spin(nums,n-k,n-1);
spin(nums,0,n-1);
}
三.结言
今天的题目分享就到这了,朋友们,咱们下次再见,拜拜~