javaScript力扣刷题——简单数组(三)

88. 合并两个有序数组

splice() 方法向/从数组添加/删除项目,并返回删除的项目。可以添加。

var merge = function(nums1, m, nums2, n) {
    nums1.splice(m,n,...nums2);
    nums1.sort(function(a,b){return a-b});
};

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。

var merge = function(nums1, m, nums2, n) {
    nums1.splice(m,n);
    nums1=[...nums1,...nums2];
    nums1.sort(function(a,b){return a-b});
};//不可行,运行后nums1长度为m,不再是m+n

 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。是一种栈的方式。

var merge = function(nums1, m, nums2, n) {
    nums1.splice(m,n);
    nums1.push(...nums2);
    nums1.sort(function(a,b){return a-b});
};//但用push是可以的,而且比splice直接添加速度更快!

283. 移动零

理解双指针,其实就是定位两种标志。

本题可以一个0,一个非零,依次遍历就可以了,将0和非0交换位置。

var moveZeroes = function(nums) {
    let j=0;
    for(let i=0;i<nums.length;i++){
        if(nums[i]!=0){
            if(i!=j){[nums[j],nums[i]]=[nums[i],nums[j]];}//注意交换的用法
            j++;
        }
    }
    return nums;
};

122. 买卖股票的最佳时机 II

可以多次购买,只要是上升趋势都可以购买。

var maxProfit = function(prices) {
    let max = min = prices[0];
    let lirun = sum = 0;
    for(let num of prices){
        if(Math.max(num,max) == num){
            max = Math.max(num,max);
            min = Math.min(num,min);
            lirun = Math.max(max-min,lirun);  
        }
        else{
            max = num;
            min = num;
            sum += lirun;
            lirun = 0;
        }        
    }
    if(lirun!=0){sum += lirun;}
    return sum;
};

更简洁的贪心算法,不是实际买卖时间,只要是上升的就算利润。

var maxProfit = function(prices) {
    let len = prices.length;
    let sum = 0;
    for(let i = 1;i<len;i++){
        sum+=Math.max(0,prices[i]-prices[i-1])
    }
    return sum;
};

简单数组题到此结束,这类题大多只需要一个循环。若是n2复杂度,则要考虑如何加变量,双指针来减少一次循环。

注意,数组sort函数不能直接用于数字排序,会有错误,需要function(a,b){return a-b}

splice函数不但可以删除也可以插入,会改变数组长度。

push,pop是栈的用法,不会改变数组长度。

上一篇:Java 求解两个数组的交集


下一篇:极客时间李煜东算法训练营2021版二期【包完结】