LeetCode 每日一题笔记
0. 前言
- 日期:2026.04.20
- 题目:2078.两栋颜色不同而距离最远的房子
- 难度:简单
- 标签:贪心
1. 题目理解
问题描述 :
街上有 n 栋房子排成一列,给定数组 colors,colors[i] 表示第 i 栋房子颜色。
要求:找到两栋颜色不同 的房子,使它们下标距离最大。
距离 = abs(i - j)
示例 :
输入:colors = [1,1,1,6,1,1,1]
输出:3
解释:最远不同颜色对:0和3 或 3和6,距离均为3。
2. 解题思路
核心观察
- 最大距离一定出现在:一端是最左(0号),另一端是最右(n-1号)
- 如果两端颜色不同,答案直接是
n-1 - 如果两端颜色相同,最优解只能是:
- 固定左端,从右往左找第一个不同颜色
- 固定右端,从左往右找第一个不同颜色
- 取两者最大值即可
算法步骤
- 从左向右遍历,同时检查:
- 左边界
i与右边界n-1是否不同 - 右边界
n-1-i与左边界0是否不同
- 左边界
- 找到第一个满足条件的位置,直接返回当前最大距离
- 贪心保证第一次找到就是全局最优
3. 代码实现
java
package lc2078;
class Solution {
public int maxDistance(int[] colors) {
int n = colors.length;
for (int i = 0; i < n; i++) {
if (colors[0] != colors[n - 1 - i] || colors[i] != colors[n - 1]) {
return n - 1 - i;
}
}
return 0;
}
}
4. 代码优化说明
- 贪心策略:只找第一个不同颜色,无需遍历全部
- 一次循环同时检查左右两端,时间最短
- 无额外空间,空间复杂度最优
- 代码极简,面试可直接默写
5. 复杂度分析
- 时间复杂度:O(n)
最坏遍历一次数组 - 空间复杂度:O(1)
只使用临时变量,无额外空间
6. 总结
- 本题属于贪心经典题:最大距离必然出现在两端
- 核心思想:固定一端,向另一端找第一个不同颜色
- 不需要暴力 O(n²),暴力会超时
- 面试高频简单题,思路固定、代码固定