• 【每日一题-leetcode】189.旋转数组


    189.旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

    示例 1:

    输入: [1,2,3,4,5,6,7] 和 k = 3

    输出: [5,6,7,1,2,3,4]

    解释:

    向右旋转 1 步: [7,1,2,3,4,5,6]

    向右旋转 2 步: [6,7,1,2,3,4,5]

    向右旋转 3 步: [5,6,7,1,2,3,4]

    示例 2:

    输入: [-1,-100,3,99] 和 k = 2

    输出: [3,99,-1,-100]

    解释:

    向右旋转 1 步: [99,-1,-100,3]

    向右旋转 2 步: [3,99,-1,-100]

    1.暴力求解

    th:k次决定了移动的次数。每移动一次就动全部元素,因为元素在变化 所有取最后一个元素就可以了。

    time : O(k*n) 移动n个元素 k次

    space:额外空间o(1)

    //暴力
        public void rotate(int[] nums, int k) {
            int previous=0,temp = 0;
            for(int i=0;i<k;i++){
                previous = nums[nums.length-1];
                for(int j = 0;j<nums.length;j++){
                    temp = nums[j];
                    nums[j] = previous;
                    previous = temp;
                }
            }
        }
    

    2.使用额外的数组

    创建一个新的数组,把移动的元素的位置固定好,关系表达式为 (k+i)%nums.length

    time:O(n)

    space:O(n)

    //使用额外的数组
        public void rotate(int[] nums, int k) {
           int [] newArr = new int [nums.length];
           for(int i=0;i<nums.length;i++){
               newArr[(i+k)%nums.length] = nums[i];
           }
           
           for(int i=0;i<nums.length;i++){
               nums[i] = newArr[i];
           }
        }
    
  • 相关阅读:
    SQLiteDatabase 源码
    SQLiteOpenHelper 源码
    Java同步机制总结--synchronized
    [Swift A]
    [Swift A]-问号&感叹号
    [Swift A]
    [Swift A]
    android 屏幕适配
    2014年度加班时间
    nodejs初学-----helloworld
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860683.html
Copyright © 2020-2023  润新知