题目
还需要你前往力扣官网查看详细的题目要求 地址
1.一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。
2.同时给你 k 个查询,用二维数组 queries 表示,其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id :
房间的面积 至少 为 minSizej ,且abs(id - preferredj) 的值 最小 ,其中 abs(x) 是 x 的绝对值。
如果差的绝对值有 相等 的,选择 最小 的 id 。如果 没有满足条件的房间 ,答案为 -1 。
3.请你返回长度为 k 的数组 answer ,其中 answer[j] 为第 j 个查询的结果。
思路
- 先把rooms进行排序,然后对queries进行循环
- 使用二分法 找到rooms里面 最小的支持item的size的下标(这里我认为是可以使用findIndex的,但是findIndex方法在力扣里面超出时间限制了) 二分法和findIndex 原理相同,都是找最小支持item的size下标 但是findIndex的判断简单一点
- 找到最小支持的下标,然后进行循环找到最小的值就可以了
代码
var closestRoom = function (rooms, queries) {
rooms.sort((a, b) => a[1] - b[1]);
let res = queries.map((item) => {
return handleGetMin(item[0], item[1], rooms);
});
return res;
};
function handleGetMin(id, size, rooms) {
// 二分开始
let left = 0;
let right = rooms.length - 1;
while (left < right) {
let mid = (left + right) >> 1;
if (rooms[mid][1] >= size) {
right = mid;
} else {
left = mid + 1;
}
}
if (left === rooms.length - 1) {
if (rooms[left][1] >= size) {
return rooms[left][0];
} else {
return -1;
}
}
let minIndex = left;
//二分结束 + 判断结束
// findIndex的方法 开始
// let findIndex = rooms.findIndex((item) => item[1] >= size);
// if (findIndex < 0) return -1;
// let minIndex = findIndex;
// findIndex的方法 结束
let nearObj = {
id: rooms[minIndex][0],
abs: Math.abs(id - rooms[minIndex][0]),
};
for (let i = minIndex + 1; i < rooms.length; i++) {
let tap = Math.abs(id - rooms[i][0]);
if (tap < nearObj.abs) {
nearObj = {
id: rooms[i][0],
abs: Math.abs(id - rooms[i][0]),
};
} else if (tap === nearObj.abs) {
nearObj.id = Math.min(nearObj.id, rooms[i][0]);
}
}
return nearObj.id;
}
// 这边模拟器了一下,l的值不会超过ccc.length-1,最大值就是 ccc.length-1
let ccc = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let l = 0;
let r = ccc.length - 1;
while (l < r) {
let mid = (l + r) >> 1;
if (mid >= 50) {
r = mid;
} else {
l = mid + 1;
}
}
console.log("结果", l);