一、需求
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
示例 3:
输入:nums = [3,2,3,1,3,2,3]
输出:3
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:
尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
二、思路分析图
(一)HashMap方案
三、代码
(一)数据初始化
/**
* 入口
* 169、多数元素
* 输入:
* nums = [3,2,2,1,1,2,2]
* 输出:
* result1 = 2
* result2 = 2
* result3 = 2
* 解释:
* 1.哈希Map方案
* 2.投票算法
* 3.排序算法
*/
@Test
public void suanfa37()
{
// 初始化
int[] nums = new int[] { 3, 2, 2, 1, 1, 2, 2 };
// 打印
// 哈希Map方案
int result1 = this.majorityElementMap(nums);
System.out.println("result1 = " + result1);
// 投票算法
int result2 = this.majorityElementVoting(nums);
System.out.println("result2 = " + result2);
// 排序算法
int result3 = this.majorityElementSort(nums);
System.out.println("result3 = " + result3);
}
(二)哈希Map方案
/**
* 哈希Map方案
* 我自己写的方案
* 假设数组是非空的,并且给定的数组总是存在多数元素
* 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素
* @param nums
* @return
*/
public int majorityElementMap(int[] nums)
{
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums)
{
if (map.containsKey(num))
{
Integer size = map.get(num) + 1;
if (size > nums.length / 2)
{
return num;
}
map.put(num, size);
}
else
{
map.put(num, 1);
}
}
return nums[0];
}
(三)投票算法
/**
* 投票算法
* Boyer-Moore:时间复杂度为 O(n)、空间复杂度为 O(1)
* 多元素个数 > 非多元素个数,所以多元素个数 - 非多元素个数 > 0
*
* @param nums
* @return
*/
public int majorityElementVoting(int[] nums)
{
int count = 0;
Integer candidate = null;
for (int num : nums)
{
if (count == 0)
{
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
(四)排序算法
/**
* 排序算法
*
* @param nums
* @return
*/
public int majorityElementSort(int[] nums)
{
Arrays.sort(nums);
return nums[nums.length / 2];
}
(五)结果图
作者:王子威
四、总结
- 学习了多数元素算法
- HashMap直接就做出来了
- 排序有想到但没有做出实践
- 投票算法没有想到这样,只是想到异或,虽然有点像但并不是
- 算法兴趣+1 总:37
- 加强了对算法的分析能力