189 Rotate Array

原创 2018年04月08日 16:43:55

Rotate Array

题目要求向右旋转给定数组k次

Python代码:

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums[:] = nums[-k:] + nums[:-k]

注意最后一定要nums[:] = nums[-k:] + nums[:-k]而不是nums = nums[-k:] + nums[:-k]因为在OJ中前者可以彻底改变旧数组,而后者只将他的引用改变到了一个新的数组中。

Solution中的几种解法:

1 Brute Force

暴力法,时间复杂度O(nk)

2 Using Extra Array

将数组按照轮转后的顺序排序在新数组中,再将新数组赋值到原数组中。

3 Using Cyclic Replacements

这是一个时间复杂度为O(n)的算法。算法的思想是从数组的第一个元素开始,直接将数组第一元素的数值替换到他轮转后的位置,同时将轮转后位置的原数值记录到temp中。如将1, 2, 3, 4, 5, 6, 7这一序列轮转3次,即k=3。则直接将数组第一个位置nums[0]1替换到nums[3]的位置,同时将该位置原元素记录到temp中。所以替换后temp = 4数组变为1, 2, 3, 1, 5, 6, 7。第二次循环从nums[3]位置开始,该位置原元素4替换到他轮转后的位置并记录将被4替换掉的元素的值到temp中。循环n次后,数组全部被替换完毕。

1, 2, 3, 4, 5, 6, 7轮转三次:

1, 2, 3, 1, 5, 6, 7  temp=4
1, 2, 3, 1, 5 ,6 ,4  temp=7
1, 2, 7, 1, 5, 6, 4  temp=3
1, 2, 7 ,1, 5, 3, 4  temp=6
1, 6, 7, 1, 5, 3, 4  temp=2
1, 6, 7, 1, 2, 3, 4  temp=5
5, 6, 7, 1, 2, 3, 4

n/k为整数时会要被替换的元素是我们第一次要替换元素的情况,如图:

所以我们通过两个循环解决问题。下面是leetcode中solution的Java代码:

public class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        int count = 0;
        for (int start = 0; count < nums.length; start++) {//外部的循环,上图中的红色、绿色循环
            int current = start;
            int prev = nums[start];
            do {
                int next = (current + k) % nums.length;
                int temp = nums[next];
                nums[next] = prev;
                prev = temp;
                current = next;
                count++;
            } while (start != current);//内部的小循环,1,3,5元素间的相互替换
        }
    }
}
4 Using Reverse

先将整个数组反转,而后反转前k项,再反转后n-k项

Original List                   : 1 2 3 4 5 6 7
After reversing all numbers     : 7 6 5 4 3 2 1
After reversing first k numbers : 5 6 7 4 3 2 1
After revering last n-k numbers : 5 6 7 1 2 3 4 --> Result

LeetCode189:Rotate Array

Rotate an array of n elements to the right by k steps.For example, with n = 7 and k = 3, the array [...
  • u012501459
  • u012501459
  • 2015-07-06 11:39:15
  • 963

LeetCode(189) Rotate Array

题目如下: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ...
  • feliciafay
  • feliciafay
  • 2015-03-20 12:24:02
  • 2798

Leetcode:189. Rotate Array(JAVA)

【问题描述】 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k ...
  • u010183658
  • u010183658
  • 2016-03-21 16:31:54
  • 379

Leetcode 189: Rotate Array

谁能告诉我, 为啥我新发的贴都消失了吗? 写个leetcode也被删? Total Accepted: 7284 Total Submissions: 40321 Rotate an...
  • xudli
  • xudli
  • 2015-03-06 07:51:14
  • 1708

LeetCode189——Rotate Array两种解法(一种易读,一种高效)

Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array...
  • booirror
  • booirror
  • 2015-02-26 09:54:19
  • 11118

【LeetCode-面试算法经典-Java实现】【189-Rotate Array(旋转数组)】

【189-Rotate Array(旋转数组)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Rotate an array of n elements to the r...
  • DERRANTCM
  • DERRANTCM
  • 2015-08-24 07:13:21
  • 3465

189. Rotate Array [easy] (Python)

题目链接https://leetcode.com/problems/rotate-array/题目原文 Rotate an array of n elements to the right by ...
  • coder_orz
  • coder_orz
  • 2016-07-28 10:32:27
  • 1722

<LeetCode OJ> 189. Rotate Array

189. Rotate Array My Submissions Question Total Accepted: 55073 Total Submissions: 278176 Diffic...
  • EbowTang
  • EbowTang
  • 2016-01-02 22:26:53
  • 931

LeetCode(189) Rotate Array

题目Rotate an array of n elements to the right by k steps.For example, with n = 7 and k = 3, the array...
  • fly_yr
  • fly_yr
  • 2015-11-02 20:17:35
  • 719

[LeetCode][189][Rotate Array]

首先,一点题外话。 这是大学学计算机到现在近6年来的时间,第一次认真刷题(PS:中间学习生涯有各种原因碰过两三道。。。)。 作为一个计算机专业出身的程序媴真的很不称职,本科以来,没写过几次代码,算法,...
  • zhemeteor
  • zhemeteor
  • 2015-03-05 15:12:09
  • 332
收藏助手
不良信息举报
您举报文章:189 Rotate Array
举报原因:
原因补充:

(最多只允许输入30个字)