189. Rotate Array

原题链接:https://leetcode.com/problems/rotate-array/description/
这道题目不错,而且题意里面已经指明有多种方法了,确实可以锻炼人的思维:

import java.util.Arrays;

/**
 * Created by clearbug on 2018/2/26.
 */
public class Solution {

    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7};
        s.rotate(nums, 3);
        System.out.println(Arrays.toString(nums));
    }

    /**
     * 方法二:在方法一的基础上优化了一点
     *
     * 提交结果:Runtime: 1 ms,beats 98.28%
     *
     * 时间复杂度:O(k + n)
     * 空间复杂度:O(k)
     *
     * @param nums
     * @param k
     */
    public void rotate(int[] nums, int k) {
        if (nums.length < 2) {
            return;
        }
        k = k % nums.length;
        int[] temp = new int[k];
        for (int i = 0; i < k; i++) {
            temp[i] = nums[nums.length - (k - i)];
        }

        for (int i = nums.length - 1; i >= k; i--) {
            nums[i] = nums[i - k];
        }

        for (int i = 0; i < k; i++) {
            nums[i] = temp[i];
        }
    }

    /**
     * 方法一:最简单,最直接,最暴力的方法
     *
     * 提交结果:Runtime: 149 ms,beats 2.27%
     *
     * 时间复杂度:O(k*n)
     * 空间复杂度:O(1)
     *
     * @param nums
     * @param k
     */
    public void rotate1(int[] nums, int k) {
        for (int i = 0; i < k; i++) {
            rotate1Helper(nums);
        }
    }

    private void rotate1Helper(int[] nums) {
        int temp = nums[nums.length - 1];
        for (int i = nums.length - 1; i > 0; i--) {
            nums[i] = nums[i - 1];
        }
        nums[0] = temp;
    }

    // 官方答案1:就是我的方法一的思路啦
    // 官方答案2:类似我的方法二,但是效率上目测还不如我的方法二
    // 官方答案3:我的大脑中曾经闪现过这种思路,但是由于实现起来比前两种方法稍微复杂点就放弃了
    // 官方答案4:利用反转操作,这种方法确实很好很强大啊
}
posted @ 2018-03-23 09:34  optor  阅读(103)  评论(0编辑  收藏  举报