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
一样可以为负数,之前对这点倒是不知道
评论