leetcode—二分搜索(easy)—4/7

1.猜数字大小

我们正在玩一个猜数字游戏。游戏规则如下:
我从1到n选择一个数字。你需要猜我选择了哪个数字。
每次你猜错了,我会告诉你这个数字是大了还是小了。
你调用一个预先定义好的接口guess(int num),它会返回3个可能的结果(-1,1或0)。

  • -1: 我的数字比较小
  • 1: 我的数字比较大
  • 0: 恭喜!你猜对了!

2.排列硬币

你总共有n枚硬币,你需要将它们摆成一个阶梯形状,第k行就必须正好有k枚硬币。
给定一个数字n,找出可形成完整阶梯行的总行数。
n是一个非负整数,并且在32位有符号整型的范围内。

3.供暖器

冬季已经来临。你的任务是设计一个固定加热半径的供暖器向所有房屋供暖。
现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。
所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。

思路:对于每座房子,有前后两个供暖器(只有一个供暖器的情况另外判断),寻找它们之间的较小距离,并与当前最大半径比较更新即可。

int findRadius(vector<int>& houses, vector<int>& heaters) {
        sort(heaters.begin(), heaters.end());
        int res = 0;
        //对于每座房子,有前后两个供暖器(只有一个供暖器的情况另外判断)
        //寻找它们之间的较小距离,并与当前最大半径比较更新即可
        for(int i = 0; i < houses.size(); i++)
        {
            int cur = INT_MAX;
            //lower_bound返回第一个大于等于这个元素的迭代器
            //此时larger就是这座房子右边的供暖器
            //使用*larger来取值
            auto larger = lower_bound(heaters.begin(), heaters.end(), houses[i]);
            if(larger != heaters.end())
            {
                //如果在房子右面存在供暖器,那么就计算它们之间的距离
                cur = *larger - houses[i];
            }
            //如果这个元素没有小于最开始的元素,那么意味着它的左边也有一个供暖器
            if(larger != heaters.begin())
            {
                //左边供暖器的位置就是当前larger位置-1
                auto smaller = larger - 1;
                //使用*smaller来取这个值,更新它们之间的最小值
                cur = min(cur, houses[i] - *smaller);
            }
            res = max(cur, res);
        }
        return res;
    }

你可能感兴趣的:(leetcode)