[路飞]_夜.leetcode第268场周赛(一)

707 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

5930. 两栋颜色不同且距离最远的房子

题目:

街上有 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(n2n^2);如果数据超过10410^4可能会超时;所以应该尝试优化一下;

贪心求解

分析需求:

  1. 如果colors数组首尾房子颜色不相同,两个颜色不同的房子最大距离是数组长度;
  2. 如果首尾房子颜色相同
    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)