leetcode-数组-续3

第一章 数组



前言

以下解答非最优解


一、简单集合

重塑矩阵

题目

输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
链接: 重塑矩阵

解答

/**
 * @param {number[][]} mat
 * @param {number} r
 * @param {number} c
 * @return {number[][]}
 */
var matrixReshape = function(mat, r, c) {
    let m = mat.length
    let n = mat[0].length
    if(r*c != m*n){
        return mat
    }

    var res = new Array(r).fill(0).map(()=>new Array(c).fill(0));
    for(let i =0;i<m*n;i++){
        res[Math.floor(i/c)][i%c] = mat[Math.floor(i/n)][i%n]
    }
    return res;

};

分糖果

题目

输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。
链接: 分糖果

解答

/**
 * @param {number[]} candyType
 * @return {number}
 */
var distributeCandies = function(candyType) {
    let setArr = new Set(candyType)
    return Math.min(setArr.size,candyType.length/2);
};

最长和谐子序列

题目

输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
链接: 最长和谐子序列

解答

/**
 * @param {number[]} nums
 * @return {number}
 */
var findLHS = function(nums) {
    let con = new Map();
    for(let i=0;i<nums.length;i++){
        con.set(nums[i],(con.get(nums[i]) || 0) + 1)
    }
    let number = 0
    for(let num of con){
        let val = con.get(num[0]+1)?num[1] + con.get(num[0]+1):(con.get(num[0]-1)?num[1] + con.get(num[0]-1):0)
        if(number < val){
            number = val
        }
    }
    return number
};

范围求和 II

题目

输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
链接: 范围求和 II

解答

/**
 * @param {number} m
 * @param {number} n
 * @param {number[][]} ops
 * @return {number}
 */
var maxCount = function (m, n, ops) {
    let mina = m;
    let minb = n;
    for (let i = 0; i < ops.length; i++) {
        mina = Math.min(mina, ops[i][0])
        minb = Math.min(minb, ops[i][1])
    }
    return mina * minb;
};

两个列表的最小索引总和

题目

输入: list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“Piatti”, “The Grill at Torrey Pines”, “Hungry Hunter Steakhouse”, “Shogun”]
输出: [“Shogun”]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。
链接: 两个列表的最小索引总和

解答

/**
 * @param {string[]} list1
 * @param {string[]} list2
 * @return {string[]}
 */
var findRestaurant = function (list1, list2) {
    let obj = {}
    let num = list2.length + list1.length
    let arr = []
    for (let i = 0; i < list1.length; i++) {
        obj[list1[i]] = i
    }
    for (let i = 0; i < list2.length; i++) {
        if (obj[list2[i]] !== undefined) {
            let total = obj[list2[i]] + i
            if (total < num) {
                num = total
                arr = [list2[i]]
            } else if (total == num) {
                arr.push(list2[i])
            }
        }
    }
    return arr
};

种花问题

题目

输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
链接: 种花问题

解答

/**
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function (flowerbed, n) {
    for (let i = 0; i < flowerbed.length; i++) {
        let last = i + 1 >= flowerbed.length ? flowerbed.length - 1 : i + 1
        let pre = i - 1 <= 0 ? 0 : i - 1
        if (flowerbed[i] == 0 && flowerbed[pre] == 0 && flowerbed[last] == 0) {
            if (n) {
                n = n - 1
                flowerbed.splice(i, 1, 1)
            }
        }
    }
    if (n == 0) {
        return true
    }
    return false
};

三个数的最大乘积

题目

输入:nums = [1,2,3]
输出:6
链接: 三个数的最大乘积

解答

/**
 * @param {number[]} nums
 * @return {number}
 */
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);
};

子数组最大平均数 I

题目

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
链接: 子数组最大平均数 I

解答

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findMaxAverage = function (nums, k) {
    let num = 0
    for (let i = 0; i < k; i++) {
        num += nums[i]
    }
    let total = num
    for (let i = k; i < nums.length; i++) {
        num = num - nums[i - k] + nums[i]
        total = Math.max(num, total)
    }
    return total / k
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值