街上有 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 。
示例 3:
输入:colors = [0,1] 输出:1 解释:两栋颜色不同且距离最远的房子是房子 0 和房子 1 。 房子 0 的颜色是颜色 0 ,房子 1 的颜色是颜色 1 。两栋房子之间的距离是 abs(0 - 1) = 1 。
思路一:不用多说,暴力两层for循环,找不同颜色的房子,取距离最远的。
代码(Python):
class Solution(object):
def maxDistance(self, colors):
result = 0
for i in range(len(colors)-1):
for j in range(i+1,len(colors)):
if colors[i]!=colors[j]:
result = max(result,abs(j-i))
return result
思路二:其实不难证明,颜色不同且距离最大的房子,其中的一个房子肯定在边界上。
假如共有5个房子,假设颜色不同且距离最大的房子出现在中间,那就说明边界的两个房子颜色相同,都记为颜色0,最大的若是第二个和第四个房子颜色不同,那这两个房子的颜色至少有一个和边界房子的颜色不同,可以自己举一些例子试试看,比如房子二是颜色1,房子四是颜色2,那这两个房子的距离没有房子二到房子五的距离大;再换个例子,比如房子二是颜色0,房子四是颜色1,那这两个房子的距离没有房子一到房子四的距离大;因此我们可以进行两次查找,第一次固定左边界,找右边出现的颜色不同且距离最大的;第二次固定右边界,找左边出现的颜色不同且距离最大的,最后取这两个距离的更大的值作为答案。
代码(Python):
class Solution(object):
def maxDistance(self, colors):
result1 = 0 #保存从左往右找的最大距离
result2 = 0 #保存从右往左找的最大距离
left = 0
right = len(colors) - 1
while left <= right:
if colors[left] != colors[right]:
result1 = max(result1,abs(right-left))
break
else:
left += 1
left = 0
right = len(colors) - 1
while left <= right:
if colors[left] != colors[right]:
result2 = max(result2,abs(right-left))
break
else:
right -= 1
return max(result1,result2) #取更大的距离