189. 轮转数组

解法1

思路

k后面的移动到前面去

实现

/**
 Do not return anything, modify nums in-place instead.
 */
function rotate(nums: number[], k: number): void {
    const len = nums.length;
    if(!len) return;
    nums.unshift(...nums.splice(len - k % len, len))
};

优化

思路

减少空间占用,减少循环,其中splice``unshift以及扩展运算符都是可优化点

实现

function rotate(nums: number[], k: number): void {
    const len = nums.length;
    if(!len) return;
    for(let i = 0,end = k % len; i < end; i++){
        nums.unshift(nums[len - 1]);
    }
    nums.length = len;
};


优化掉了splice...,可以明显的看出减少了空间复杂度。
不过空间复杂度减了后,时间复杂度又上去了😂

继续优化

猜测

我猜测时间复杂度是unshift导致的,毕竟每次unshift都是一次从前往后排的一个过程,都会影响到整个数组。那么我只要不让它重排就好了。

实现

实现不了。。。前面掐尾容易,但是掐头难,掐头得用上splice,但是这样复杂度又上升了,所以未能实现,或许以后能找到更优的掐头方式。

最后

这只是其中的一种解法,按进阶的说法

至少3种解法,及O(1)的空间复杂度还差的远。
在此期间也知道了数组的splice第一个参数可以像slice一样可以为负数,之前对这点倒是不知道

评论

0 / 800
全部评论()