从零开始刷力扣(二)

164 阅读2分钟

我正在参加「掘金·启航计划」

414. 第三大的数

示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。

示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 

第一版思路:

因为要取出第三个大的数,第一想法就是数组进行排序和去重,最后得到的数组长度超出三个就取第三个数,没有超出就取最大的那个数就行。

var thirdMax = function(nums) {
    const arr = nums.sort((a,b) => b - a)
    const arr2 = [...new Set(arr)]
    if (arr2.length >= 3) {
        return arr2[2]
    } else {
        return arr2[0]
    }
};

第二版思路:首先先定义三个最小数,然后遍历数组,先和第一个数进行大小比较,如果大于,则给第一个数赋值,然后把之前的值给第二个数,第二个的给第三个数,这样,遍历循环第一个数组一直就是最大的数,依次类推,然后在对第二个和第三个数进行比较更新,最后如果第三个数被赋值了,说明存在第三个大的数字,返回第三个数就行,如果没有被赋值,说明长度不够,返回最大的第一个数。

var thirdMax = function(nums) {
    let first = -Infinity, second = -Infinity, third = -Infinity;
    nums.forEach(item => {
        if (item > first) {
            third = second
            second = first
            first = item
        } else if (item < first && item > second) {
            third = second
            second = item
        } else if (item < second && item > third) {
            third = item
        }
    })
    return third === -Infinity ? first : third
};

628. 三个数的最大乘积

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入:nums = [1,2,3]
输出:6

示例 2:
输入:nums = [1,2,3,4]
输出:24

示例 3:
输入:nums = [-1,-2,-3]
输出:-6

第一版思路:

1、全正的情况下就是三个最大正数的乘积

2、全负的情况下就是三个最小负数的乘积

3、有正有负的情况就是三个正数的乘积或者一个最大正数和两个最小负数的乘积

var maximumProduct = function(nums) {
    nums.sort((a, b) => b -a)
    return Math.max(nums[0]*nums[1]*nums[2], nums[0]*nums[nums.length -2]*nums[nums.length -1])
};