目录
2.三段逆置
3.空间换时间
题目
给定一个整数数组 num ,将数组中的元素向右轮转 k个位置,其中 k是非负数
解法
暴力求解,旋转k次
(效率太低,写出来过不了)
时间复杂度:O(n^2)
空间复杂度:O(1)
三段逆置
时间复杂度:O(n)
空间复杂度:O(1)
代码:
//设置左右的边界
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 numSize, int k)
{
if (k > numSize)
k% numSize;
//前n-k个逆置
reverse(nums, 0, numSize - k - 1);
//后k个逆置
reverse(nums, numSize - k,numSize-1);
//整体逆置
reverse(nums, 0, numSize -1);
}
空间换时间
时间复杂度:O(n)
空间复杂度:O(n)
memcpy()函数的使用
头文件
#include <cstring>
使用
void * memcpy ( void * destination, const void * source, size_t num );
参数含义
目的地
指向要复制内容的目标数组的指针,类型转换为 void* 类型的指针。
源
指向要复制的数据源的指针,类型转换为类型为 const void* 的指针。
数字
要复制的字节数。size_t 是无符号整数类型
第一次复制 第二次复制
第三次复制再整体逆置过去
代码
#include <malloc.h>
#include <cstring>//memcpy
//memcpy的用法
//void* memcpy(void* destination, const void* source, size_t num);
void rotate(int* nums, int numsSize, int k)
{
if (k > numsSize)
k% numsSize;
int* tmp = (int*)malloc(sizeof(int) * numsSize);
memcpy(tmp+k,nums,sizeof(int)*(numsSize - k));
memcpy(tmp , nums+ numsSize -k, sizeof(int) * (k));
memcpy(nums, tmp, sizeof(int) * (numsSize));
free(tmp);
tmp=NULL;
}