Skip to content

Latest commit

 

History

History
45 lines (43 loc) · 1.63 KB

2532.md

File metadata and controls

45 lines (43 loc) · 1.63 KB

2532. Time to Cross a Bridge

Solution 1 (time O(nlogk), space O(k))

class Solution(object):
    def findCrossingTime(self, n, k, time):
        """
        :type n: int
        :type k: int
        :type time: List[List[int]]
        :rtype: int
        """
        time.sort(key=lambda x: x[0] + x[2])
        cur_time, remain = 0, n
        wait_left = [-i for i in range(k - 1, -1, -1)]
        wait_right = []
        work_left = []
        work_right = []
        while remain > 0 or wait_right or work_right:
            while work_left and work_left[0][0] <= cur_time:
                p = heapq.heappop(work_left)
                heapq.heappush(wait_left, -p[1])
            while work_right and work_right[0][0] <= cur_time:
                p = heapq.heappop(work_right)
                heapq.heappush(wait_right, -p[1])
            if wait_right:
                i = -heapq.heappop(wait_right)
                cur_time += time[i][2]
                heapq.heappush(work_left, [cur_time + time[i][3], i])
            elif remain > 0 and wait_left:
                i = -heapq.heappop(wait_left)
                cur_time += time[i][0]
                heapq.heappush(work_right, [cur_time + time[i][1], i])
                remain -= 1
            else:
                next_time = float("inf")
                if work_left:
                    next_time = min(next_time, work_left[0][0])
                if work_right:
                    next_time = min(next_time, work_right[0][0])
                if next_time != float("inf"):
                    cur_time = next_time
        return cur_time