day23 题目:剑指 Offer 39. 数组中出现次数超过一半的数字剑指 Offer 66. 构建乘积数组

知识点:数组、哈希、前缀和,难度为简单、中等

学习计划链接:「剑指 Offer」 - 学习计划

题目知识点难度
剑指 Offer 39. 数组中出现次数超过一半的数字数组哈希表分治计数 \简单
剑指 Offer 66. 构建乘积数组数组前缀和中等

# 剑指 Offer 39. 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

注意:本题与主站 169 题相同:https://leetcode-cn.com/problems/majority-element/

# 思路及代码

思路一:利用哈希,当出现次数超过一半就立刻返回,但这样空间复杂度和时间复杂度都为 O (n)

var majorityElement = function(nums) {
    let m = new Map()
    for ( let i = 0; i < nums.length; i++) {
        if (m.has(nums[i])) {
            let t = m.get(nums[i])
            if(t+1 > Math.floor(nums.length / 2))
                return nums[i]
            m.set(nums[i],t + 1)
        } else m.set(nums[i], 1)
    }
    return nums[nums.length-1]
};

思路二:在大神 Krahets 题解中提到的 摩尔投票法,主要要注意两个推论,详见题解。

  • 推论一: 若记 众数 的票数为 +1非众数 的票数为 -1 ,则一定有所有数字的票数和 > 0
  • 推论二: 若数组的前 a 个数字的 票数和 = 0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 > 0 ,即后 (n-a) 个数字的 众数仍为 x

ps:这个思路真是清奇。没想到

var majorityElement = function(nums) {
    let vote = 0;
    let candidate = null;
    for (let num of nums) {
        if (vote === 0) 
            candidate = num;
        vote += (num === candidate) ? 1 : -1;
    }
    return candidate;
};

# 剑指 Offer 66. 构建乘积数组

给定一个数组  A[0,1,…,n-1] ,请构建一个数组  B[0,1,…,n-1] ,其中  B[i]  的值是数组  A  中除了下标  i  以外的元素的积,即  B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1] 。不能使用除法。

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]

提示:

  • 所有元素乘积之和不会溢出 32 位整数
  • a.length <= 100000

# 思路及代码

这题就有些类似之前字节校园的题目:冲刺春招 - 精选笔面试 66 题大通关 day14:135. 分发糖果 的弱化弱化版了,从左往右初始化下数组 l , l[i] 表示 i 左侧所有数字的乘积,而第二次遍历从右侧开始,算出右侧乘积和后直接加到数组上。

/**
 * @param {number[]} a
 * @return {number[]}
 */
var constructArr = function(a) {
    let res = new Array(a.length)
    let l = [1]
    for (let i = 1; i < a.length; i++) 
        l.push(l[i-1] * a[i-1])
    let r = 1;
    for (let i = a.length - 1; i >= 0; --i) { // 右侧乘积 & res 计算
        if(i != a.length-1)
            r *= a[i+1]
        res[i] = l[i] * r
    }
    return res
};
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

cos 微信支付

微信支付

cos 支付宝

支付宝