码迷,mamicode.com
首页 > 编程语言 > 详细

旋转数组

时间:2015-07-25 12:25:28      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:旋转数组   算法   数据结构   

1. 问题描述

  从右侧旋转一个n个元素的数组,旋转k位。例如:n=7,k=3arr=[1,2,3,4,5,6,7]旋转成为arr=[5,6,7,1,2,3,4]


2. 方法与思路

  其实这个问题类似于字符串逆置问题中的句子逆置。比如“hello world”逆置成”world hello”。解决这种问题的O(1)空间复杂的算法通常是先逆置单词,后逆置整个句子。
  针对这个问题,思路一样。第一次逆置前半段[4,3,2,1,5,6,7],第二次逆置后半段[4,3,2,1,7,6,5],最后整个逆置[5,6,7,1,2,3,4]。


注意:如果k大于数组的长度,则需要k=k%arr.len,因为数组在旋转一圈后还是等于原来的数组。


  
  主要过程如下:

  I. for i:0arr.size?k?1
      逆置
  II. for i:(arr.size?k)arr.size?1
      逆置
  III. for i:0arr.size?1
      逆置

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int i,j;

        k = k%nums.size();

        for(i = 0,j = nums.size() - k -1; i < j; i ++,j--)
            swap(nums[i],nums[j]);
        for(i = nums.size()-k,j = nums.size()-1; i < j; i++,j--)
            swap(nums[i],nums[j]);

        for(i = 0,j = nums.size()-1; i < j; i++,j--)
            swap(nums[i],nums[j]);
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

旋转数组

标签:旋转数组   算法   数据结构   

原文地址:http://blog.csdn.net/jeanphorn/article/details/47054555

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!