LeetCode刷题|Day2 数组

先巩固一下关于js原型的内容:

1.原型链通过_proto_层层向上;

2.prototype对象中存放能够被继承的属性。

 安全验证 - 知乎

↑一个介绍地详细的文章

 instanceof运算符:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

function instanceofF(A, B) {
    var L = A.__proto__;
    var R = B.prototype;
    if (L === R) {
        //A的内部属性__proto__指向B的原型对象
        return true;
    }
    return false;
} 

知识点整理:

JavaScript 数组(Array)是有序数据的集合,数组中的每个成员被称为元素(Element),每个元素的名称(键)被称为数组下标(Index)。数组的长度是弹性的、可读写的。

数组常用方法:JavaScript中数组常用方法汇总(ES5)

三点运算符:【ES6】扩展运算符(...) 最常用的方法!!_扩展运算符 覆盖_Milk595的博客-CSDN博客

题目:495. 提莫攻击

我的思路:一开始,想通过打标签的方法统计每秒的中毒状态,但是这样需要O(2n)的时间,对于超大数据量的样本超时了。

因此,应该控制时间复杂度在单次扫描的范围内O(n)。

这里需要重点考虑,上一次中毒未结束时,下一次中毒状态已经开始的情况。

第一种解法:(前面完整+后面部分)

var findPoisonedDuration = function(timeSeries, duration) {
    let ans = 0;
    let expired = 0;
    for (let i = 0; i < timeSeries.length; ++i) {
        if (timeSeries[i] >= expired) {
            ans += duration;
        } else {
            ans += timeSeries[i] + duration - expired;
        }
        expired = timeSeries[i] + duration;
    }
    return ans;
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/teemo-attacking/solution/ti-mo-gong-ji-by-leetcode-solution-6p4k/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第二种解法:(前面部分+后面完整)

var findPoisonedDuration = function(timeSeries, duration) {
    var sum=0;

    for (i=0; i<timeSeries.length-1; i++){
        j=timeSeries[i];
        k=timeSeries[i+1];

        sum += Math.min((k-j),duration);
    }
    
    sum += duration;
    return sum;
};

题目:安全验证 - 知乎

方法一:排序,找到不重复的第三个最大值。

var thirdMax = function(nums) {
    nums.sort((a, b) => b - a);
    var diff=1;
    var thrid=0;
    for( i=1; i<nums.length; i++){
        if(nums[i]!=nums[i-1]) diff++;
        if(diff==3) {
            return nums[i];
        }
    }
    return nums[0];
};

方法二:去重,再排序:

var thirdMax = function(nums) {
    var set = new Set(nums);
    if (set.size < 3) {
        return Math.max(...[...set]);
    } else {
        var li = [...set];
        li.sort((a, b) => b-a);
        return li[2];
    }
};

作者:doublez0108
链接:https://leetcode.cn/problems/third-maximum-number/solution/lai-zi-bei-da-suan-fa-ke-de-leetcodeti-j-sekf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法三:利用有序集合的特性,遍历数组每次插入数后如果长度大于3就移除集合里的最小值。

方法四:用a,b,c三个值维护firstMax,secondMax,thirdMax。初始化-Number.MAX_VALUE或者NULL。

题目:628. 三个数的最大乘积

 没有复杂的算法,但是需要思考出这个结论:

复杂度分析

时间复杂度:logO(NlogN),其中 N 为数组长度。排序需要 logO(NlogN) 的时间。

空间复杂度:logO(logN),主要为排序的空间开销。

优化:我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。

var maximumProduct = function(nums) {
    // 最小的和第二小的
    let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
    // 最大的、第二大的和第三大的
    let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;

    for (const x of nums) {
        if (x < min1) {
            min2 = min1;
            min1 = x;
        } else if (x < min2) {
            min2 = x;
        }

        if (x > max1) {
            max3 = max2;
            max2 = max1;
            max1 = x;
        } else if (x > max2) {
            max3 = max2;
            max2 = x;
        } else if (x > max3) {
            max3 = x;
        }
    }

    return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/maximum-product-of-three-numbers/solution/san-ge-shu-de-zui-da-cheng-ji-by-leetcod-t9sb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 时间复杂度:O(N),其中 N 为数组长度。我们仅需遍历数组一次。

空间复杂度:O(1)。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值