leetcode No189.Rotate Array

PS:介绍两种算法及C/C++代码

Question:

Rotate an array of  n  elements to the right by  k  steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Solution:

一、算法分析

1、很自然的想法是把元素依次平移,但是Time Limit Exceed委屈。代码就不贴了

2、百度的算法,自己写的代码,还是学到了不少东西,毕竟刚开始

(1)逆序前n-k个元素

(2)逆序后k个元素

(3)逆序所有元素

二、代码

(1)C
void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;  //若k>numsSize则只需平移k%numsSize
    int i,j,temp=0;
    for(i=0,j=numsSize-k-1;i<j;i++,j--)
    {
        temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    for(i=numsSize-k,j=numsSize-1;i<j;i++,j--)
    {
        temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    for(i=0,j=numsSize-1;i<j;i++,j--)
    {
        temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
leetcode No189.Rotate Array_第1张图片
(2)C++
使用vector中的reverse函数,reverse(a,b)逆序从指针a到指针b的元素
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();   
        int numsSize = nums.size();
        reverse(nums.begin(),nums.begin()+numsSize-k);  //nums.begin()为nums数组的起始指针
        reverse(nums.begin()+numsSize-k,nums.end());    //nums.end()为nums数组的结束指针
        reverse(nums.begin(),nums.end());
    }
};
leetcode No189.Rotate Array_第2张图片



你可能感兴趣的:(LeetCode)