当前位置:   article > 正文

简单易懂——轮转数组:将数组中的元素向右轮转 k 个位置(c语言实现LeeCode.189:中等)_数组的右旋转c语言

数组的右旋转c语言

在这篇博客文章中。

我们将讨论三种在C语言中将固定长度序列的数组,元素向右轮转'k'位的方法。

(即元素向右轮转' k' 个位置。如果元素挪动到了数组末尾,仍需要挪动,则从数组开头继续挪动)

我们这里使用动图来理解这个过程。

接下来所有的用例说明:将 后两个 数移动到整排数据的前面。即将数列右轮转‘2’位

方法一:翻转法

翻转法的时间复杂度为O(N),空间复杂度为O(1)。我们可以通过以下三个步骤实现:

  1. 翻转前半部分。
  2. 翻转后半部分。
  3. 翻转整体。 

步骤1和2:

步骤3:

代码部分:

  1. void reverse(int* nums, int begin, int end) {
  2. while (begin < end) {
  3. int tmp = nums[begin];
  4. nums[begin] = nums[end];
  5. nums[end] = tmp;
  6. ++begin;
  7. --end;
  8. }
  9. }
  10. void rotate(int* nums, int numsSize, int k) {
  11. if (k > numsSize) {
  12. k %= numsSize;
  13. }
  14. reverse(nums, 0, numsSize - k - 1);
  15. reverse(nums, numsSize - k, numsSize - 1);
  16. reverse(nums, 0, numsSize - 1);
  17. }

方法二:空间换时间法

空间换时间法的时间复杂度为O(N),空间复杂度为O(N)。我们可以通过将前后半段拷贝到一个新的数组中实现。

读懂代码,你可能需要的知识:

memcpy(需要数据的地址,源头地址,字节数)

指针的加减的具体含义

#粗略认识:待整理完相关资料将为大家设置超链接详解

方法二  代码详解:

  1. void rotate(int* nums, int numsSize, int k) {
  2. if (k > numsSize) {
  3. k %= numsSize;
  4. }
  5. int* tmp = (int*) malloc(sizeof(int) * numsSize);
  6. memcpy(tmp, nums + numsSize - k, sizeof(int) * k);
  7. memcpy(tmp + k, nums, sizeof(int) * (numsSize - k));
  8. memcpy(nums, tmp, sizeof(int) * numsSize);
  9. free(tmp);
  10. }

方法三:依次交换法——直觉算法(无法通过leecode测试!)

时间复杂度为 O(K*numSize) ≈ O(N^2)。应该尽量避免使用

具体代码实现:

  1. void rotate(int* nums, int numsSize, int k) {
  2. if (k > numsSize) {
  3. k %= numsSize;
  4. }
  5. for (int i = 0; i < k; i++) {
  6. int last = nums[numsSize - 1];
  7. for (int j = numsSize - 1; j > 0; j--) {
  8. nums[j] = nums[j - 1];//相当于把‘K’之前的数,都往前挪动一位
  9. }
  10. nums[0] = last;
  11. }
  12. }

现在我们已经提供了三种将数组中的前m个元素移动到数组末尾的方法。根据您的需求,您可以根据时间和空间复杂度选择合适的方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/567432
推荐阅读
相关标签
  

闽ICP备14008679号