leetcode 169多数问题

tech2022-09-17  114

求出现频率大于n/2向下取整的数的两种方法

排序法 先将所有的数按照顺序排序,例如数组A={1,1,1,3,3,4,4,4,4,4,4, 4,,5},n=13

既然数组中有出现次数> ⌊ n/2 ⌋的元素,那排好序之后的数组中,相同元素总是相邻的。 即存在长度> ⌊ n/2 ⌋的一长串 由相同元素构成的连续子序列,时间复杂度为O(n*logn)

2. 摩尔投票法 基本原理: 候选人(cand_num)初始化为nums[0],票数count初始化为1。 当遇到与cand_num相同的数,则票数count = count + 1,否则票数count = count - 1。 当票数count为0时,更换候选人,并将票数count重置为1。 遍历完数组后,cand_num即为最终答案。

作者:gfu 链接:https://leetcode-cn.com/problems/majority-element/solution/3chong-fang-fa-by-gfu-2/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

算法理解 count加和count减的过程可以理解为不同元素之间的两两抵消,因为“多数”的数量大于⌊ n/2 ⌋,所以最后只有他会抵消不掉 时间复杂度为O(n)

class Solution { public int majorityElement(int[] nums) { int cand_num = nums[0], count = 1; for (int i = 1; i < nums.length; ++i) { if (cand_num == nums[i]) ++count; else if (--count == 0) { cand_num = nums[i]; count = 1; } } return cand_num; } }
最新回复(0)