1、总结
- divide and conquer是我的薄弱项,这样的题型我都不知道从何下手;
2、题目
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: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
3、我的解法
依旧是先实现一波,用到了map,效率一般:
/**
* @param {number[]} nums
* @return {number}
*/
// 解法一:
var majorityElement = function(nums) {
let tempObject = {};
for(let i = 0; i < nums.length; i++) {
if(nums[i] in tempObject) {
tempObject[nums[i]]++;
} else {
tempObject[nums[i]] = 1;
}
if(tempObject[nums[i]] > (nums.length)/2) {
return nums[i];
}
}
};
4、其他解法
solution_01依旧是暴力破解先实现一下:
/**
* @param {number[]} nums
* @return {number}
*/
// 方法二:
var majorityElement = function(nums) {
let majorityCount = nums.length/2;
for(let i = 0; i < nums.length; i++) {
let count = 0;
for(let j = 0; j < nums.length; j++) {
if(nums[j] == nums[i]) {
count++;
}
}
if(count > majorityCount) {
return nums[i];
}
}
return -1;
};
效率当然还是差,第一次直接报超时,第二次倒是通过了,但是我们看下结果比对:35倍的时间复杂度!
solution_02是hashMap的解法,也就是我自己实现的方法思路,这里不重复说明;
solution_03排序,这个算法有点意思,我之前有模糊的概念但是没有想明白,现在重新试一下:
// 方法三:在有序数组中,主要元素一定在majority位置处
var majorityElement = function(nums) {
nums.sort();
return nums[Math.ceil(nums.length/2) - 1];
// 如果元素个数为偶数则在n/2处,如果元素个数为奇数,则在(n+1)/2处
};
solution_04这个随机数推断的方法我是真的没看懂,留给节后了,哈哈哈
solution_05分而治之
我在related topics里面又看到了divide and conquer,我对分而治之几乎完全不了解,又是一个挑战吧,已经准备把所有分而治之的题型收集起来…
solution_06投票大法