题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是 非空的,并且给定的数组 总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
来源:力扣(LeetCode)
题目大意
给出一个数组找到这个数组中出现次数>n/2的元素
思路描述
由于普通的哈希表思想过于简单,所以这里介绍时间复杂度为O(n),空间复杂度为O(1)的解法:
做法:一次消去 两个不相同的数,剩下的数一定是多数元素
解释:
由于一定存出现次数大于n/2的数所以就算所有其他的数都来和出现次数大于n/2的数相消也一定可以留下至少一个出现次数大于n/2的数
解题步骤:
- 确定一个血量hp
- 确定一个当前数currentNums
- 如果hp=0将当前遍历到的数更新为currentNums
- 如果currentNums和当前遍历到的数相同就将hp+1
- 如果currentNums和当前遍历到的数相同就将hp-1
- 获得最后的currentNums就是最大元素
代码
class Solution {
//超级水王问题
//一次删除两个不同的数
public int majorityElement(int[] nums) {
int hp=0;
int currentNums=0;
for(int i=0;i<nums.length;i++){
if(currentNums==nums[i]){
hp++;
}
if(hp==0){
currentNums=nums[i];
hp++;
}
if(currentNums!=nums[i]){
hp--;
}
}
return currentNums;
}
}
写在最后
今日感受:啥玩应是拓扑排序啊,leetcode_802的拓扑排序确实难搞不明白,这篇是leetcode_802的替代品,等过两天在更leetcode_802
如果感觉写的还不错的话不妨分享给其他人,以求共同进步!
文章如有错误之处请指出,我会听取并改正!