初级算法-3.旋转数组

题目描述:

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数

示例 :
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
分析:
1.最简单的想法:每次右移一位,分k次完成。。但是,效率太低
2.将数组进行三次翻转:例: 0 1 2 3 4,k=2
  第一次:翻转前length-k%length个元素   2 1 0 3 4
  第二次:在第一次的基础上翻转全部元素    4 3 0 1 2
  第三次:在第二次的基础上翻转前面k个元素 3 4 0 1 2

代码:

 1 void rotate(int* nums, int numsSize, int k) {
 2     if(k<=0||numsSize<=1||k%numsSize==numsSize) return;
 3     int t;
 4     int i;
 5     int count=(numsSize-k%numsSize)/2;
 6     int end=numsSize-1-k%numsSize;
 7     //0 1 2 3 4
 8     
 9     for(i=0;i<count;i++)
10     {
11         t=nums[i];
12         nums[i]=nums[end-i];
13         nums[end-i]=t;
14     }
15     //2 1 0 3 4
16     end=numsSize-1;
17     for(i=0;i<numsSize/2;i++){
18         t=nums[i];
19         nums[i]=nums[end-i];
20         nums[end-i]=t;
21     }
22     //4 3 0 1 2
23     end=k%numsSize-1;
24     for(i=0;i<k%numsSize/2;i++){
25         t=nums[i];
26         nums[i]=nums[end-i];
27         nums[end-i]=t;
28     }
29     //3 4 0 1 2
30         
31 }

猜你喜欢

转载自www.cnblogs.com/hzhqiang/p/10738761.html