大佬,牛!!!
- 题目:给你一个数组,找到出现次数超过一般的数。
- 我的思路:直接哈希map,然后value记录出现次数,key记录数,然后如果value大于长度一半了直接returnkey即可。但是这个思路时间复杂度居然很高,我真的是无语了,o(n)啊。
- 大佬思路:大佬的思路是投票。依次for循环遍历数组,然后首选选择第一个数,跟这个数一样就是+1,不一样就-1。然后票数等于0,就可以再选下一个数。注意,下一个数就是我们遍历的下一个即可。这个思路非常巧妙,其实就是不一样的就相互抵消,既然不一样就相互抵消,那么最后肯定剩下的就是最多的啊。因为大家都跟我抵消,也抵消不过。
- 技巧:投票法
java代码——我的思路
class Solution {
public int majorityElement(int[] nums) {
// 排序后返回中间那个
int length = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < length; i++) {
map.putIfAbsent(nums[i], 0);
int t = map.get(nums[i]) + 1;
if (t > length / 2) {
return nums[i];
}
map.put(nums[i], t);
}
return -1;
}
}
java代码——大佬思路
class Solution {
public int majorityElement(int[] nums) {
// 排序后返回中间那个
int length = nums.length;
int count = 0;
int ans = 0;
for (int num : nums) {
if (count == 0) {// 重新选一个人
ans = num;
}
count += (num == ans) ? 1 : -1;
}
return ans;
}
}
- 虽然是简单题目,但是大佬的思路还是非常牛的,也是我值得学习的地方,这里附上大佬链接。