169J. Majority Element
https://leetcode.com/problems/majority-element/
Method 1 HashMap TS O(N) O(N)
这个办法是 用值本身对应出现的次数 并且可以一边加一边判断是否要 return nums[i]。所以最后的 return 0 已经不重要了。
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> myMap = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(myMap.get(nums[i]) == null){
myMap.put(nums[i],1);
}else{
int temp = myMap.get(nums[i])+1;
myMap.put(nums[i],temp);
}
if(myMap.get(nums[i]) + 1 > (nums.length + 1)/2){
return nums[i];
}
}
return 0;
}
}
Method 2 Approach 6: Boyer-Moore Voting Algorithm TS O(N) O(1)
这个是好方法 学习一下 https://leetcode.com/problems/majority-element/solution/
可以这么想,如果令major element = + 1, 其他的为 -1.
因为一定存在major element, 数组之和必为正。
从头开始iterate,先取第一个为candidate, 和它相同就count+1,
反之-1。当count == 0,下一次循环的时候,取该element为candidate。
可以想像,由于主成分更多,即使中间无数次选到了错的candidate,最后一定会被
主成分“逆转”,最后还是变成以主成分为“正”的情形。
class Solution {
public int majorityElement(int[] nums) {
int count = 0; // 新建 count
int candidate = 0; // 新建candidate,是什么不重要
for(int n : nums){
if( count == 0){
// 对于第一个元素,或者发生了逆转,会赋值candidate 为 n,
//发生逆转意味着,前面的子数组,有一样多数量的 主成分和非主成分,剩下的子数组一定有更多的主成分
candidate = n;
}
count += candidate == n ? 1 : -1;
}
return candidate; //最后剩下来的candidate 一定是正确的candidate
}
}
Last updated
Was this helpful?