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;
}