zoukankan      html  css  js  c++  java
  • 刷题-力扣-189

    189. 旋转数组

    题目链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/rotate-array/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题目描述

    给定一个数组,将数组中的元素向右移动 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]
    

    说明:

    * 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
    * 要求使用空间复杂度为 O(1) 的 原地 算法。
    * 通过次数210,743提交次数468,201
    

    题目分析

    1. 根据题目描述和实例,首先想到循环法。
    2. 每次移动一个元素,总共移动k次。时间复杂度为O(kn),空间复杂度为O(1)。超时。
    3. 反转法。先反转整个列表,再反转前k个元素,反转后n - k个元素,即可。

    代码

    循环法,时间复杂度O(kn)(超时)

    class Solution {
    public:
        void rotate(vector<int>& nums, int k) {
            int n = nums.size();
            k = k % n;
            for (int i = 0; i < k; i++) {
                int e = nums[n - 1];
                for (int j = n -1; j > 0; j --) {
                    nums[j] = nums[j - 1];
                }
                nums[0] = e;
            }
        }
    };
    

    反转法,时间复杂度O(n)

    class Solution {
    public:
    
        void reverse(vector<int>& nums, int s, int e) {
            while (s < e) {
                int temp = nums[s];
                nums[s++] = nums[e];
                nums[e--] = temp;
            }
        }
    
        void rotate(vector<int>& nums, int k) {
            int n = nums.size();
            k = k % n;
            reverse(nums, 0, n - 1);
            reverse(nums, 0, k - 1);
            reverse(nums, k, n - 1);
        }
    };
    

    用时36min

  • 相关阅读:
    Key and Certificate Conversion
    openssl
    python http通信实现
    鼠标右键添加cmd
    好文章
    wireshark里无网络接口解决办法
    python垃圾回收
    终于有人把 Docker 讲清楚了
    mongodb的监控与性能优化
    mongodb创建超级用户和普通用户(对应数据库的用户)
  • 原文地址:https://www.cnblogs.com/HanYG/p/14253189.html
Copyright © 2011-2022 走看看