[LeetCode] 169. Majority Element
Posted aaronliu1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 169. Majority Element相关的知识,希望对你有一定的参考价值。
求大多数。题意是给一个数组,有一个数字出现次数超过了数组长度的一半,请求出这个数字。我给出几个不同解法。
1. 排序,然后直接找数组中间那个数字。
时间O(nlogn)
空间O(1)
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var majorityElement = function(nums) { 6 nums.sort(); 7 return nums[Math.floor(nums.length / 2)]; 8 };
2. hashmap计算每个不同元素出现的次数,返回次数超过数组长度一半的那个数字。
时间O(n)
空间O(n)
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var majorityElement = function(nums) { 6 let dict = {}; 7 let breakpoint = nums.length / 2; 8 for (let i = 0; i < nums.length; i++) { 9 dict[nums[i]] = dict[nums[i]] || 0; 10 dict[nums[i]]++; 11 if (dict[nums[i]] > breakpoint) { 12 return nums[i]; 13 } 14 } 15 };
3. 投票法。意思是先assume一个元素是要找的元素,设为X好了,再记录一个变量count。遍历数组,如果遍历到跟X不同的数字的时候,count--,并且要换一个X;如果跟X一样,就count++。因为最后要找的X的出现次数会超过数组长度的一半,所以最后剩下的那个元素一定是要找的元素。
时间O(n)
空间O(1)
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var majorityElement = function(nums) { 6 let count = 0; 7 let res = 0; 8 for (let i = 0; i < nums.length; i++) { 9 if (count === 0) { 10 res = nums[i]; 11 } 12 if (nums[i] !== res) { 13 count--; 14 } else { 15 count++; 16 } 17 } 18 return res; 19 };
以上是关于[LeetCode] 169. Majority Element的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 169. Majority Element
LeetCode 169. Majority Element