力扣 轮转数组三段逆置法和三段拷贝法(C语言)

目录

  • 1.三段逆置法
  • 2.三段拷贝法

其实轮转数组有更简单易懂的方法,就是以下两种方法

1.三段逆置法

先将前n-k项逆置,再将后k项逆置,最后再将整个数组逆置就可得到想要的效果

void reverse(int* arr, int left, int right)
{
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
   	arr[right] = tmp;
		left++;
		right--;
	}
}

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);
   
}

2.三段拷贝法

与三段逆置法相似,三段拷贝法需要另开辟一个相同大小的数组,首先将后k个拷贝到新数组里,再将前n-k个拷贝到后面的位置里,最后再将新数组的值拷贝到旧数组

void rotate(int* nums, int numsSize, int k) 
{  k%=numsSize;
	 int nums1[numsSize];
  memcpy(nums1,nums+numsSize-k,sizeof(int)*k);
	memcpy(nums1+k,nums,sizeof(int)*(numsSize-k));
	memcpy(nums,nums1,sizeof(int)*(numsSize));
}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

你可能感兴趣的:(leetcode,算法,c语言)