日常刷题0x22之未出新手村

125 阅读1分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号:74
//改进一下二分查找
var searchMatrix = function (matrix, target) {

    //先用列上找到一个大于target的最近的值
    //然后顺着这一行去扫描查找对应target
    //row记录大于target的最近的行
    let left = 0, right = matrix.length - 1, row = 0
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)
        if (matrix[mid][0] > target) {
            right = mid - 1
        } else if (matrix[mid][0] < target) {
            left = mid + 1
            row = mid
        } else {
            //在列上找到返回,没有找到就要从行搜索
            return true
        }
    }

    left = 0, right = matrix[0].length - 1
    while (left <= right) {
        let mid = Math.floor(left + (right - left) / 2)
        if (matrix[row][mid] > target) {
            right = mid - 1
        } else if (matrix[row][mid] < target) {
            left = mid + 1
        } else {
            return true
        }
    }
    return false
}

//根据下标升序二分查找
var searchMatrix = function (matrix, target) {

    let left = 0, right = matrix.length * matrix[0].length - 1
    while (left <= right) {
        let mid = Math.floor(left + (right - left)/2)
        if (matrix[Math.floor(mid / matrix[0].length)][mid % matrix[0].length] > target) {
            right = mid - 1
        } else if (matrix[Math.floor(mid / matrix[0].length)][mid % matrix[0].length] < target) {
            left = mid + 1
        } else {
            return true
        }
    }
    return false
}
题号:253
//优先队列:最小堆
//要记录会议室正在开会的最小结束时间,下个会议开始的时间小于这个记录的最小时间的话
//此时这个会议室没法复用,会议没结束呢,要新开会议室,如果大于这个记录的最小时间
//那么说明此时要开的会议可以使用这个会议室
var minMeetingRooms = function (intervals) {
      
    let buildHeap = (endTimes) => {
        const len = endTimes.length
        for (let i = Math.floor(len/2) - 1; i >= 0; i--) {
            const left = i * 2 + 1, right = i * 2 + 2
            if (right > len - 1) {
                //最后一个非叶子节点无右儿子
                if (endTimes[i] > endTimes[left]) {
                    let tmp = endTimes[i]
                    endTimes[i] = endTimes[left]
                    endTimes[left] = tmp
                }
            } else {
                let min = left
                if (endTimes[left] > endTimes[right]) {
                    min = right
                }
                if (endTimes[i] > endTimes[min]) {
                    //开始交换
                    let tmp = endTimes[i]
                    endTimes[i] = endTimes[min]
                    endTimes[min] = tmp
                }
            }
        }
    }

    //按开始时间排序
    intervals.sort((a,b) => {
        return a[0] - b[0]
    })
    let minHeap = []
    for (let i = 0; i < intervals.length; i++) {
        if (minHeap.length == 0) {
            minHeap.push(intervals[i][1])
        } else {
            //会议结束时间
            let min = minHeap[0]
            if (min <= intervals[i][0]) {
                //此时有腾出来的会议室
                minHeap.shift()
                minHeap.push(intervals[i][1])
            } else {
                minHeap.push(intervals[i][1])
            }
        }
        buildHeap(minHeap)
    }
    return minHeap.length
};