————————今天去见习啦 jio疼 然后然后回来啦 写一个旋转数组
垂死病重惊坐起!!!兄弟!!今天敲代码了吗??
———————————————————————————————————————————
旋转数组
nums[]={1,2,3,4,5,6,7};
k=3; 实现效果5,6,7,1,2,3,4
那么开始 (--> *-->)
方法一
暴力求解
思路:遍历数组
①先将nums[i]放到tmp中;
②再将数组中各个数往后挪一个;(numsSize-1)
③最后再将tmp放到nums[0]中;
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
int tmp;
int i = 0;
int j;
for (i = k; i<numsSize-1 ; i++)
{
tmp = nums[i];
for (j = numsSize - 1; j > 0; j--)
{
nums[j] = nums[j - 1];
}
nums[0] = tmp;
}
}
但是这个方法时间复杂度为0(n*k)当需要反转次数大时为0(n^2) 空间复杂度为0(1)
方法二
以空间换时间(新创建一个数组放它)
开辟新的空间存放-----
将n-k个放到前面 对(i+k)对numsSize取模;
将n-k-1个放到后面
void rotate(int* nums, int numsSize, int k){
int* tmp = (int*)malloc(sizeof(int)*numsSize);
for (int i = 0; i < numsSize; i++)
{
tmp[(i+k)%numsSize] = nums[i];
}
for(int i = 0; i < numsSize; i++)
{
nums[i] = tmp[i];
}
free(tmp);
tmp = NULL;
}
时间复杂度为o(n) 空间复杂度也是O(n)
方法三
比较新奇 没做过这类的题还不好想- - - ->>
三步反转法 1,2,3,4,5,6,7
第一步先将n-k个逆转 4,3,2,1,5,6,7
第二转再将k个逆转4,3,2,1,7,6,5
第三步再将整个数组逆转5,6,7,1,2,3,4
代码如图
void reverse(int* nums, int start, int end)
{
int tmp;
while (start < end)
{
tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}
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);
}