当前位置:   article > 正文

【leetcode】189.轮转数组_下列程序的功能是定义一个数组,将数组中的元素向右轮转k个位置,其中k是非负数。例

下列程序的功能是定义一个数组,将数组中的元素向右轮转k个位置,其中k是非负数。例

一、题目描述

给一个数组,将数组中的元素向右轮转k个位置,其中k是非负数

 二、思路

1.暴力求解(旋转k次)

先保存最后一个元素,然后整体向后移动,再将保存的元素放到数组的第一个位置

时间复杂度:O(N^2)

空间复杂度:O(1)

思路1的效率超时,所以在oj中不能通过

2.用空间换时间

用一个新的数组先存放要旋转的元素(k个元素),然后再将剩余的元素拷贝到新的数组中,最后再将新数组中的内容拷贝到原数组中

3.三步翻转法

将后k个元素旋转,剩余元素再旋转一次,再整体旋转

三、实现

思路1:

  1. #include<stdio.h>
  2. //轮转数组
  3. void rotate(int* nums, int numsSize, int k)
  4. {
  5. while (k--)
  6. {
  7. int tmp = nums[numsSize - 1];
  8. for (int i = numsSize-1; i >0 ; i--)
  9. {
  10. nums[i] = nums[i - 1];
  11. }
  12. nums[0] = tmp;
  13. }
  14. }
  15. int main()
  16. {
  17. int arr[] = { 1,2,3,4,5,6,7 };
  18. int k = 3;
  19. int sz = sizeof(arr) / sizeof(arr[0]);
  20. rotate(arr, sz, k);
  21. for (int i = 0; i < sz; i++)
  22. {
  23. printf("%d ", arr[i]);
  24. }
  25. return 0;
  26. }

思路2:

  1. void rotate(int* nums,int numsSize,int k{
  2. //用空间换取时间
  3. int* arr=(int*)malloc(numsSize*sizeof(int));
  4. k%=numsSize;
  5. //将后k个放到新数组中
  6. for(int i=0;i<k;i++)
  7. {
  8. arr[i]=nums[numsSize-k+i];
  9. }
  10. //将元素中剩余元素放到新数组中
  11. for(int i=0;i<numsSize-k;i++)
  12. {
  13. arr[k+i]=nums[i];
  14. }
  15. for(int i=0;i<numsSize;i++)
  16. {
  17. nums[i]=arr[i];
  18. }
  19. free(arr);
  20. arr=NULL;
  21. }

注意:这里的k%=numsSize,如果说数组中只有一个元素,而k=2,此时会发生越界访问

假设我们一共有五个元素,当k=5的时候,就是员顺序保持不变,当k=6时,相当于向右旋转1个元素

思路3:

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

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

闽ICP备14008679号