力扣题目 - 1847.最近的房间

发布于:2024-12-18 ⋅ 阅读:(14) ⋅ 点赞:(0)

题目

还需要你前往力扣官网查看详细的题目要求 地址

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 。如果 没有满足条件的房间 ,答案为 -13.请你返回长度为 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);

网站公告

今日签到

点亮在社区的每一天
去签到