「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」
题目:
街上有 n 栋房子整齐地排成一列,每栋房子都粉刷上了漂亮的颜色。给你一个下标从 0 开始且长度为 n 的整数数组 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 。
解题思路
暴力求解
枚举数组中所有房子,将【房子颜色】两两对比,将两个颜色不同的房子距离计算出找到最大值即可;
根据上述思路编辑代码如下:
var maxDistance = function (colors) {
const len = colors.length
let result = 0
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (colors[i] !== colors[j]) {
result = Math.max(result, j - i)
}
}
}
return result
}
解题分析
根据上述代码分析,该解题思路时间复杂度为O();如果数据超过可能会超时;所以应该尝试优化一下;
贪心求解
分析需求:
- 如果colors数组首尾房子颜色不相同,两个颜色不同的房子最大距离是数组长度;
- 如果首尾房子颜色相同
a.从左到右找到第一个与首位房子颜色不相同的房子,位置假设为left;
b.从右到左找到第一个与尾位房子颜色不相同的房子,位置假设为right;
c.那么两个颜色不同的房子最大距离只能是left、len-right-1、len-left-1、right d.返回4中可能的最大值即可
编辑代码如下:
var maxDistance = function(colors) {
const len = colors.length;
if(colors[0] !== colors[len-1]) return len-1;
let left = 0;
while(colors[left] === colors[0]){
left++;
}
let right = len-1
while(colors[right] === colors[len-1]){
right--;
}
return Math.max(left,len-1-right,len-1-left,right)
};
解题分析
时间复杂度:O(n)