Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
Example 1:
Input: [3,2,3] Output: 3Example 2:
Input: [2,2,1,1,1,2,2] Output: 2
求众数。题意是给一个数组,有一个数字出现次数超过了数组长度的一半,请求出这个数字。
我给出几个不同解法,其中最优解投票法。
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数组的第一个元素是要找的元素,设为candidiate,再记录一个变量count。遍历数组,如果遍历到跟X不同的数字的时候,count--,当count == 0的时候,同时需要换一个candidate;如果跟X一样,就count++。最后剩下的那个candidate就是要找的元素,因为他的出现次数超过了数组的一半所以一定不会被替换掉。
时间O(n)
空间O(1)
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var majorityElement = function (nums) { 6 let count = 0; 7 let res = 0; 8 let candidate = nums[0]; 9 for (let num of nums) { 10 if (num === candidate) { 11 count++; 12 } else { 13 count--; 14 } 15 if (count === 0) { 16 candidate = num; 17 count++; 18 } 19 } 20 return candidate; 21 };
Java实现
1 class Solution { 2 public int majorityElement(int[] nums) { 3 int count = 0; 4 int candidate = nums[0]; 5 for (int num : nums) { 6 if (num != candidate) { 7 count--; 8 } else { 9 count++; 10 } 11 if (count == 0) { 12 candidate = num; 13 count++; 14 } 15 } 16 return candidate; 17 } 18 }
相关题目