力扣_轮转数组

目录

题目

解法

1.暴力求解,旋转k次

2.三段逆置

代码:

3.空间换时间

memcpy()函数的使用

头文件

使用

参数含义

代码


题目

给定一个整数数组 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;
}

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值