【问题标题】:Binary search algo for leetcode heater questionleetcode 加热器问题的二进制搜索算法
【发布时间】:2021-01-12 06:16:45
【问题描述】:

我正在尝试关注 leetcode 加热器问题(简单难度)。

我写了一个不起作用的算法(我意识到我做错了什么),所以我去讨论解决方案。

在那里,我偶然发现有人使用二分搜索,但无法理解他们的逻辑。 谁能解释一下(算法)我们如何使用二进制搜索来解决这个问题(谷歌搜索没有任何帮助)

这是我的非二进制搜索算法,它不起作用

/**
 * @param {number[]} houses
 * @param {number[]} heaters
 * @return {number}
 */
var findRadius = function(houses, heaters) {
    let maximumDist = 1
  let currentDist = i = cHeaterIndex = 0
  while (i<houses.length){
    const cHeaterPosition = heaters[cHeaterIndex]
    if (houses[i] === cHeaterPosition || i === houses.length-1) {
      if (houses[i] === cHeaterPosition) {
        if (maximumDist < currentDist) {
          maximumDist = parseInt((currentDist - 1)/2)
        } 
      } else {
        maximumDist = currentDist - 1
      }
        currentDist = 1
        cHeaterIndex++
    }
    i++
    currentDist++
   }
   return maximumDist 
};

【问题讨论】:

    标签: javascript data-structures dsa


    【解决方案1】:

    二分查找的逻辑是:

    找到最适合特定房屋的加热器的左右位置。 现在,考虑一下,如果给定排序后的数字,并且您必须找到一个值,您将使用二分搜索。

    这里也一样,根据加热器位置给你排序的数字,搜索值是特定的房屋位置。现在,您必须找到最接近该房屋位置的加热器位置值的索引。

    示例:

    加热器[] = {1,2,3,8} house_position = 5。

    所以,从左边最接近的加热器值是 3(索引 = 2),我们可以通过二分搜索找到。现在,这是可以加热这个房子的加热器的左侧位置。正确放置的加热器也可以加热位于下一个索引(索引 = 3)的房屋,其值为 8。因此,该特定房屋可以由位置 3 和 8 的两个加热器加热。从中我们将找到最佳加热器位置离房子的距离最小(因为那将有最小的半径)。在这种情况下,它是位置 3(index=2) 的加热器,它与房屋的距离为 2。

    这就是本题二分查找的逻辑。

    这是相同的工作示例(JAVA 代码)。

     /**
     * @param {number[]} houses
     * @param {number[]} heaters
     * @return {number}
     */
    var findRadius = function(houses, heaters) {
        var totalhouses = houses.length, totalheaters = heaters.length, index=0, currindex=0, max = 0, currmin;
        heaters.sort((a, b) => a - b);
        while(index< totalhouses) {
            currindex = search(heaters, houses[index], 10);
            if(currindex==-1) {  //if left positioned heater is not present
                currmin = heaters[0] - houses[index];
            } else {
                if(currindex+1 < totalheaters) {
                    currmin = Math.min(heaters[currindex+1] - houses[index], houses[index] - heaters[currindex]);
                } else {   //if right positioned heater is not present
                    currmin = houses[index] - heaters[currindex];
                }
            }
            max = Math.max(max, currmin); 
            index++;
        }
        return max;
    };
    
    var search = function(heaters, value) {  //binary search to find best possible left positioned heater for the house
        var start=0,end = heaters.length-1, mid=0;
        while(start<=end) {
            mid = Math.floor((start + end) / 2);
            if(heaters[mid] == value){
                return mid;
            } else if(heaters[mid] > value) {
                end = mid-1;
            } else {
                start = mid+1;
            }
        }
        return end;
    }
    

    【讨论】:

    • @Diza Moa 如果您有任何与二进制搜索背后的解决方案或逻辑相关的问题,您可以提出同样的问题。谢谢。
    • @downvoter 我可以知道downvote 的原因吗。@Diza Mora 正在询问基于二进制搜索的解决方案,在给出解决方案之前,我在 leetcode 上也尝试了同样的方法,它运行良好。跨度>
    • 问题是要求算法而不是确切的代码。添加了较早的代码,以使算法更加清晰。但我已经编辑了代码并将其更新为 javascript。谢谢。
    • @Diza Moa 我们可以进一步优化代码,但为了保持算法清晰,我试图使其更具可读性。如果您有任何与此相关的问题,请告诉我。
    • @Diza Moa 如果您的问题得到解决,请您接受并支持答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2013-09-19
    • 2011-09-16
    • 2021-11-17
    • 2011-05-30
    • 2022-11-25
    相关资源
    最近更新 更多