Easy
题目描述
在一条街上有 n 栋房屋,每栋房屋都被漆成了美丽的颜色。给你一个下标从 0 开始的整数数组 colors,其中 colors[i] 表示第 i 栋房屋的颜色。
返回两栋颜色不同的房屋之间的最大距离。
第 i 栋和第 j 栋房屋之间的距离是 abs(i - j),其中 abs(x) 是 x 的绝对值。
示例 1:
输入:colors = [1,1,1,6,1,1,1]
输出:3
解释:上图中,颜色 1 是蓝色,颜色 6 是红色。
两栋颜色不同且距离最远的房屋是房屋 0 和房屋 3。
房屋 0 的颜色是 1,房屋 3 的颜色是 6。它们之间的距离是 abs(0 - 3) = 3。
注意房屋 3 和房屋 6 也能产生最优答案。
示例 2:
输入:colors = [1,8,3,8,3]
输出:4
解释:上图中,颜色 1 是蓝色,颜色 8 是黄色,颜色 3 是绿色。
两栋颜色不同且距离最远的房屋是房屋 0 和房屋 4。
房屋 0 的颜色是 1,房屋 4 的颜色是 3。它们之间的距离是 abs(0 - 4) = 4。
示例 3:
输入:colors = [0,1]
输出:1
解释:两栋颜色不同且距离最远的房屋是房屋 0 和房屋 1。
房屋 0 的颜色是 0,房屋 1 的颜色是 1。它们之间的距离是 abs(0 - 1) = 1。
约束条件:
- n == colors.length
- 2 <= n <= 100
- 0 <= colors[i] <= 100
- 数据保证至少有两栋房屋颜色不同
解题思路
这道题要求找到颜色不同的两栋房屋之间的最大距离。由于数组长度最大只有100,我们可以考虑多种解法。
解法1:暴力枚举 遍历所有可能的房屋对 (i, j),如果颜色不同则更新最大距离。时间复杂度O(n²)。
解法2:贪心策略(推荐) 根据题目提示,最大距离一定来自于以下两种情况之一:
- 最左边的房屋(索引0)与右边某个颜色不同的房屋
- 最右边的房屋(索引n-1)与左边某个颜色不同的房屋
这是因为要使距离最大,我们应该尽可能选择端点。我们可以:
- 从左端点开始,找到第一个颜色不同的房屋,计算距离
- 从右端点开始,找到第一个颜色不同的房屋,计算距离
- 返回两者的最大值
这种方法时间复杂度为O(n),空间复杂度为O(1),是最优解法。
代码实现
class Solution {
public:
int maxDistance(vector<int>& colors) {
int n = colors.size();
int maxDist = 0;
// 从左端点开始找
for (int i = n - 1; i >= 0; i--) {
if (colors[i] != colors[0]) {
maxDist = max(maxDist, i - 0);
break;
}
}
// 从右端点开始找
for (int i = 0; i < n; i++) {
if (colors[i] != colors[n - 1]) {
maxDist = max(maxDist, (n - 1) - i);
break;
}
}
return maxDist;
}
};
class Solution:
def maxDistance(self, colors: List[int]) -> int:
n = len(colors)
max_dist = 0
# 从左端点开始找
for i in range(n - 1, -1, -1):
if colors[i] != colors[0]:
max_dist = max(max_dist, i - 0)
break
# 从右端点开始找
for i in range(n):
if colors[i] != colors[n - 1]:
max_dist = max(max_dist, (n - 1) - i)
break
return max_dist
public class Solution {
public int MaxDistance(int[] colors) {
int n = colors.Length;
int maxDist = 0;
// 从左端点开始找
for (int i = n - 1; i >= 0; i--) {
if (colors[i] != colors[0]) {
maxDist = Math.Max(maxDist, i - 0);
break;
}
}
// 从右端点开始找
for (int i = 0; i < n; i++) {
if (colors[i] != colors[n - 1]) {
maxDist = Math.Max(maxDist, (n - 1) - i);
break;
}
}
return maxDist;
}
}
var maxDistance = function(colors) {
const n = colors.length;
let maxDist = 0;
// 从左端点开始找
for (let i = n - 1; i >= 0; i--) {
if (colors[i] !== colors[0]) {
maxDist = Math.max(maxDist, i - 0);
break;
}
}
// 从右端点开始找
for (let i = 0; i < n; i++) {
if (colors[i] !== colors[n - 1]) {
maxDist = Math.max(maxDist, (n - 1) - i);
break;
}
}
return maxDist;
};
复杂度分析
| 复杂度 | 贪心解法 | 暴力解法 |
|---|---|---|
| 时间复杂度 | O(n) | O(n²) |
| 空间复杂度 | O(1) | O(1) |