先将前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);
}
与三段逆置法相似,三段拷贝法需要另开辟一个相同大小的数组,首先将后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));
}
结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!