Rotate Array

原创 2016年08月30日 16:36:41

Problem

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]. How many different ways do you know to solve this problem?

这道题是旋转数组。大致思路如下:
1.复制数组,最简单的方式。
2.采用类似冒泡排序的方式,每次将最右边一个移到最前面。
3.采用旋转逆序的方式。

talk is cheap,show me the code!

public class RotateArray {

    public static void printArray(int[] array) {
        for(int i=0; i<array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    //方法一:复制数组,时间复杂度与空间复杂度均为O(n)
    public static void rotate(int[] nums, int k) {
        if(k > nums.length) {
            k%= nums.length;
        }

        int[] result = new int[nums.length];

        for(int i=0; i<k; i++) {
            result[i] = nums[nums.length-k+i];
        }

        int j = 0;
        for(int i=k; i<nums.length; i++) {
            result[i] = nums[j];
            j++;
        }

        System.arraycopy(result,0,nums,0,nums.length);
    }

    //方法二:类似于冒泡排序,时间复杂度O(nk),空间复杂度O(1)
    public static void bubble_rotate(int[] nums, int k) {
        if(nums == null || k < 0) {
            throw new IllegalArgumentException("Illegal argument!");
        }

        for(int i=0; i<k; i++) {
            for(int j=nums.length-1; j>0; j--) {
                int tmp = nums[j];
                nums[j] = nums[j-1];
                nums[j-1] = tmp;
            }
        }
    }

    //方法三:逆序的方式,时间复杂度O(n),空间复杂度O(1)
    public static void reverse_rotate(int[] nums, int k) {
        if(nums == null || k < 0) {
            throw new IllegalArgumentException("Illegal argument!");
        }

        reverse_array(nums,0,k-1);
        reverse_array(nums,k,nums.length-1);
        reverse_array(nums,0,nums.length-1);
    }

    public static void reverse_array(int[] array, int left, int right) {
        if (array == null || array.length == 0 || left < 0 || right < 0) {
            throw new IllegalArgumentException("Illegal argument!");
        }

        while(left < right) {
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,6,7};
        reverse_rotate(nums,3);
        printArray(nums);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[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 [...

【LeetCode笔记】Rotate Array

写了两种方法 1. 用STL函数 void rotate(int num[], int n, int k){ k %= n; if(k == 0) return...

Rotate Array -- leetcode

Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the arr...

Rotate Array 部分旋转数组

先介绍简单的解法1: 进行观察后,可以想到一种解决方案。 1. 利用额外k空间 (这里 k = 3) , 存储[5, 6, 7 ] 2. 将前面的[1, 2, 3, 4] 后移k 位。此时arr...

rotate array

Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array...

Leetcode - Rotate Array

Rotate an array of n elements to the right by k steps.For example, with n = 7 and k = 3, the array [...

[C++]Rotate Array 旋转数组

leetcode 原题链接:https://leetcode.com/problems/rotate-array/ Rotate an array of n elements to ...
  • lyy_hit
  • lyy_hit
  • 2015年08月21日 10:06
  • 751

[LeetCode][189][Rotate Array]

首先,一点题外话。 这是大学学计算机到现在近6年来的时间,第一次认真刷题(PS:中间学习生涯有各种原因碰过两三道。。。)。 作为一个计算机专业出身的程序媴真的很不称职,本科以来,没写过几次代码,算法,...

[Leetcode]Rotate Array java(三种)

首先注意题目是向右移 Method 1.申明额外空间 一直移位 进行旋转 代码就不给了会超时 Method 2. 交换 (不论是运用递归交换还是公约数进行移动交换) 这里用递归,主要是把要旋转的进...

leetcode 189. Rotate Array

leetcode 189. Rotate Array 题目大意: Rotate an array of n elements to the right by k steps. 譬如说对于k=3,[1,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Rotate Array
举报原因:
原因补充:

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