码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 169. Majority Element

时间:2020-01-28 09:20:17      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:floor   ram   请求   hash   break   param   空间   else   for   

求大多数。题意是给一个数组,有一个数字出现次数超过了数组长度的一半,请求出这个数字。我给出几个不同解法。

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

标签:floor   ram   请求   hash   break   param   空间   else   for   

原文地址:https://www.cnblogs.com/aaronliu1991/p/12237347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!