目录
[一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间)](#一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间))
[Java 完整代码](#Java 完整代码)
[二、75. 颜色分类(三指针,原地排序)](#二、75. 颜色分类(三指针,原地排序))
[Java 完整代码](#Java 完整代码)
大家好,今天分享两道经典算法题 ------169. 多数元素 (简单)和 75. 颜色分类 (中等),都是面试高频考点,我会用最优解法 + 完整 Java 可运行代码实现,新手也能直接看懂、直接运行。
一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间)
题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊n/2⌋ 的元素,题目保证一定存在。
核心思路
利用摩尔投票法:
- 维护一个候选值
candidate和计数器count - 相同数字计数 + 1,不同数字计数 - 1
- 计数器归零时,更换候选值
- 最终剩下的候选值就是多数元素(因为它永远无法被完全抵消)
Java 完整代码
java
运行
public class MajorityElement {
// 核心方法:摩尔投票法
public int majorityElement(int[] nums) {
int candidate = 0;
int count = 0;
for (int num : nums) {
// 计数器归零,更换候选人
if (count == 0) {
candidate = num;
}
// 相同+1,不同-1
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
// 测试主函数
public static void main(String[] args) {
MajorityElement solution = new MajorityElement();
int[] nums = {2, 2, 1, 1, 1, 2, 2};
System.out.println("多数元素:" + solution.majorityElement(nums));
// 输出:2
}
}
复杂度分析
- 时间复杂度:O (n),仅遍历一次数组
- 空间复杂度:O (1),无额外空间开销
二、75. 颜色分类(三指针,原地排序)
题目描述
给定一个包含红色、白色、蓝色,共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照 0(红)、1(白)、2(蓝)顺序排列。不能使用库函数排序。
核心思路
三指针法(荷兰国旗问题):
p0:0 的右边界,左边全是 0p2:2 的左边界,右边全是 2curr:当前遍历指针- 遇到 0 放左边,遇到 2 放右边,遇到 1 跳过
Java 完整代码
java
运行
public class SortColors {
public void sortColors(int[] nums) {
int p0 = 0;
int curr = 0;
int p2 = nums.length - 1;
while (curr <= p2) {
if (nums[curr] == 0) {
// 交换 0 到左区
swap(nums, curr, p0);
p0++;
curr++;
} else if (nums[curr] == 2) {
// 交换 2 到右区
swap(nums, curr, p2);
p2--;
} else {
// 1 留在中间,直接跳过
curr++;
}
}
}
// 数组交换工具方法
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
// 测试主函数
public static void main(String[] main) {
SortColors solution = new SortColors();
int[] nums = {2, 0, 2, 1, 1, 0};
solution.sortColors(nums);
System.out.print("排序结果:");
for (int num : nums) {
System.out.print(num + " ");
}
// 输出:0 0 1 1 2 2
}
}
复杂度分析
- 时间复杂度:O (n),一次遍历完成排序
- 空间复杂度:O (1),原地排序,无额外空间
三、总结(面试必背)
- 多数元素 :用摩尔投票法,空间最优,面试高频送分题
- 颜色分类 :用三指针,属于荷兰国旗问题,原地排序经典题
- 两道题都做到了 O (n) 时间 + O (1) 空间,是最优解