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

解法一:
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个数据,最后整体逆置。
