首页 > 编程语言 >【Leetcode 169 】 多数元素——投票算法要把我迷倒了

【Leetcode 169 】 多数元素——投票算法要把我迷倒了

时间:2024-08-09 16:24:59浏览次数:16  
标签:count candidate nums 数量 length num 迷倒 Leetcode 169

 

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

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

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

/** 排序实现 */
function majorityElement(nums: number[]): number {
  /** 由于排序,而且题目中说明一定有 出现次数大于 nums.length / 2 的值 */
  /** 所以 奇数情况下 [1, 2, 3, x, 5, 6, 7] ,无论是前半部分还是后半部分,符合条件的值的位置都会有x这个值,否则数量无法达标*/
  /** 偶数情况下,[1,2,x,y,5,6],无论是前半部分还是后半部分,符合条件的值的位置都会有x,y这两个值,否则数量无法达标 */
  let index = Math.floor(nums.length / 2);
  nums.sort((a, b) => a - b);
  return nums[index];
}

/** Boyer-Moore投票算法 */
/**
 *  思想:将数组的值分为两类,一类为 结果值(出现次数大于 nums.length / 2),且称为x,而另一类就是其余的值,称为y
 *  首先 x的数量 一定是大于 y的数量,同理,x数量 - a > y数量 - a  ,满足这个公式,则可以通过x与y相互抵消来获取结果,因为最后剩下的一定是x
 *
 */
function majorityElement(nums: number[]): number {
  /** 结果值,假设其为0(初始为任何数值都可以) */
  let candidate = 0;
  /** count 用于保留x的数量,如果count为0,则证明candidate的值并不是真正的结果值。则改变candidate的值 */
  let count = 0;
  for (const num of nums) {
    /** 当count为0时,表示x的数量为0,candidate并不是我们想要的值,赋值为下一个num */
    if (count === 0) {
      candidate = num;
    }
    /**
     * 目前candidate的值假设为真正的结果值
     *  如果num = candidate,则表示x值的数量多了一个,则+1,
     *  否则表示y值的数量多了一个,则-1
     */
    count += candidate === num ? 1 : -1;
  }
  /** 因为题目中假设了一定有值 出现次数大于 length / 2 的,所以在x类与y类相互抵消中,最后剩下的一定的x类,则值为candidate */
  return candidate;
}

 

标签:count,candidate,nums,数量,length,num,迷倒,Leetcode,169
From: https://blog.csdn.net/Caoshuang_/article/details/141062479

相关文章

  • LeetCode | 1 Two Sum
    分析Givenanarrayofintegersnumsandanintegertarget,returnindicesofthetwonumberssuchthattheyadduptotarget.Youmayassumethateachinputwouldhaveexactlyonesolution,andyoumaynotusethesameelementtwice.Youcanreturnthean......
  • Leetcode | 202 Happy Number
    分析在快乐数的题意上,通常情况下我们都会去顺着题目的意思去寻找最终结果是否为1,而后面的另一句话很有启示意义:"也可能是无限循环,但始终变不到1",那么为什么不会是无限不循环呢?证明范围限制:对于一个(d)位数的正整数(n),其最大值为99d=Max位数减少:每次计算之后,数字位数d要么减......
  • Leetcode热题100-128.最长连续序列
    Leetcode热题100-128.最长连续序列1.题目描述2.解题思路3.代码实现1.题目描述128.最长连续序列2.解题思路使用哈希集合的思想:初始化一个unordered_set并将nums中所有元素放入集合中;遍历数组,依次判断当前元素是否为连续序列的开始,若是则求出当前连续序列......
  • leetcode考试题
       +-------------+----------+|ColumnName|Type|+-------------+----------+|id|int||client_id|int||driver_id|int||city_id|int||status|enum||request_at|varchar|......
  • LeetCode | 349 Intersection Of Two Arrays
    分析两个数组的交集,双指针使用的前提是,两个数组已经处于有序状态。双指针的本质是遍历;双指针在线性数据结构中,进行数据处理,每次只专注于两个元素;指针遍历将问题拆解为两部分,即已解决和待解决问题。倘若两个数组是无序的状态,双指针指向每次都无法确认是否在历史中已经出现过,这个时......
  • LeetCode 1111. 有效括号的嵌套深度
    1111.有效括号的嵌套深度有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有......
  • 代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形
    代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形LeetCode(42)接雨水题目代码importjava.util.Stack;classSolution{publicinttrap(int[]height){//用单调栈进行操作intsum=0;Stack<Integ......
  • LeetCode144 二叉树的前序遍历
    前言题目:144.二叉树的前序遍历文档:代码随想录——二叉树的递归遍历编程语言:C++解题状态:基础知识不了解思路两种思路,第一是递归。递归算法有三个要素。每次写递归,都按照这三要素来写!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就......
  • (leetcode学习)50. Pow(x, n)
    实现 pow(x,n) ,即计算x的整数 n次幂函数(即,xn)。示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2.00000,n=-2输出:0.25000解释:2-2=1/22=1/4=0.25提示:-100.0<x<100.0-231<=n<=231......
  • Leetcode: 1484. Groups Sold Products By The Date
    题目要求如下:输入的数据为要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序。下面是实现的代码:importpandasaspddefcategorize_products(activities:pd.DataFrame)->pd.DataFrame:val=activities.drop_duplicates().groupby("sell......