力扣3 : 数组翻转

159 阅读1分钟

3. 数组翻转

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

3.1 方案一

      var rotate = function (nums, k) {
        // 得到求余后翻转值
        let change = k % nums.length;
        // 割去需要翻转的部分
        let newNums = nums.splice(nums.length - change, change);
        // 将割去的部分填入开头
        nums.splice(0, 0, ...newNums);
      };

思路 : 首先为了方便阅读, 先得到求余后翻转的值change, 这一步是为了避免nums.length < k的情况, 接着割去翻转的部分, 假设nums = [1, 2, 3, 4, 5, 6, 7], 若 k = 3 , 那么割去的部分为 [5, 6, 7], 然后再将这部分用splice方法添加到开头中, 并且注意不是使用newNums, 而是需要用到ES6的扩展运算符方法, 将[5, 6, 7] 转换成参数序列5, 6, 7

时间复杂度 : O(n)

注意, splice方法的时间复杂度是O(n)

空间复杂度 : O(k)

3.2 方案二(超出时间限制)

      var rotate = function (nums, k) {
        if (k >= 0) {
          for (let i = 0; i < k; i++) {
            let last = nums[nums.length - 1];
            nums.pop();
            nums.unshift(last);
          }
        }
      };

先说一下, 这个方案是超时的, 但是值得拿出来说一下, 为了避免后续踩坑, 后面会说明为什么超时

思路 : 检测k是否>=0 (题目要求k为非负数), 进入循环, 循环k次, 每一次循环都是将数组的最后一个值存起来, 并且放入开头, 还要记得删掉最后一个值, 循环结束就能得到翻转数组

时间复杂度 : O(n * k)

分析 : 因为unshift()的源码使用到了for循环, 所以unshift的时间复杂度已经是O(n)了, 再加上最外层k次的循环, 时间复杂度为O(n * k), 因此超出了力扣规定的时间

空间复杂度 : O(1)


PS : 作者只是个算法萌新, 觉得方案有不妥的, 轻喷, 十分欢迎讨论与指正, 并且如果有更好的方案, 那就更欢迎了.接下来会慢慢更新每一题算法, 需要的可以点个关注不迷路=.=