返回
独乐乐不如众乐乐:进阶装逼求众数
见解分享
2023-12-17 12:44:02
身为一名资深的技术博客创作专家,在下游走网络江湖多年,见惯了装逼求众数的各种姿势。今天,在下就来分享几种进阶装逼大法,让大家在装逼界屹立不倒,笑傲群雄。
先来回顾一下求众数的传统装逼套路:
众所周知,求众数就是求一个数组中出现次数超过一半的元素。最朴素的解法莫过于暴力求解:遍历数组,统计每个元素出现的次数,最后找出出现次数最多的元素。这种方法简单粗暴,但效率感人。
装逼进阶套路一:哈希表闪亮登场
哈希表,江湖人称Map,其轻功卓绝,寻物神速。求众数时,我们可将数组元素作为键,出现次数作为值,存入哈希表中。遍历哈希表,找出出现次数最多的键,即可得到众数。此法时间复杂度O(n),空间复杂度O(n)。
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int majority = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > majority) {
majority = entry.getKey();
}
}
装逼进阶套路二:摩尔投票法,以暴制暴
摩尔投票法,江湖人称Boyer-Moore Voting Algorithm,其以暴制暴,化繁为简。该算法有两个关键步骤:
- 找出候选众数:遍历数组,统计元素出现的次数,找出出现次数最多的元素。
- 验证候选众数:再次遍历数组,统计候选众数出现的次数,若次数超过数组长度的一半,则候选众数即为众数。
int candidate = 0;
int count = 0;
for (int num : nums) {
if (count == 0) {
candidate = num;
count = 1;
} else if (candidate == num) {
count++;
} else {
count--;
}
}
if (count > 0) {
int majorityCount = 0;
for (int num : nums) {
if (num == candidate) {
majorityCount++;
}
}
if (majorityCount > nums.length / 2) {
return candidate;
}
}
return -1;
装逼进阶套路三:位运算大显神通
位运算,江湖人称Bit Manipulation,其玄妙无穷,出神入化。求众数时,我们可以利用异或运算的性质:相同则异或为0,不同则异或为1。
设众数为x,则对于任意一个非众数y,x异或y的结果必定不为0。因此,我们可以遍历数组,将所有元素异或起来,结果即为众数。
int majority = 0;
for (int num : nums) {
majority ^= num;
}
独乐乐不如众乐乐,高手齐聚一堂
以上三种装逼求众数的套路,各有千秋,但殊途同归。高手们可以根据实际情况,选择最适合自己的装逼姿势,在装逼界叱咤风云,无人能敌。
当然,装逼有度,切莫过头。技术之道,在于精进,而非浮夸。愿天下装逼者,皆能学有所成,用技术装点世界。