日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode考场就坐

發布時間:2024/1/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode考场就坐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我的解法:
1.考慮極端情況,無人就座,只有1人就座且(坐在左邊,中間,最右邊),只剩下最左邊和最右邊的座位等等
2.想的是查找最大的間隔,如果間隔兩端都有人那么就坐中間,如果間隔左邊沒人坐左邊,左邊有人右邊無人坐右邊
3.如果間隔大于1/2總長度就可以跳出了,后面的間隔不會更大了

class ExamRoom:def __init__(self, n: int):self.seat_list=[]self.seat_set=set()self.left=0self.right=0self.n=ndef seat(self) -> int:n=self.nif self.seat_list==[]:self.seat_list.append(0)self.seat_set.add(0)return 0if len(self.seat_set)>=n-2 and 0 not in self.seat_set:self.seat_list.insert(0,0)self.seat_set.add(0)return 0 last=-1max_gap=n-1-self.seat_list[-1]-1if max_gap<0:max_gap=0left=-1right=nhalf_gap=n//2 insert_loc=0for student in range(0,len(self.seat_list)):gap=self.seat_list[student]-lastif gap//2>max_gap//2: max_gap=gapleft=lastright=self.seat_list[student]insert_loc=studentif max_gap>half_gap:break last=self.seat_list[student]if left in self.seat_set and right in self.seat_set:new_seat=(left+right)//2self.seat_list.insert(insert_loc,new_seat)self.seat_set.add(new_seat)return new_seatif n-1 not in self.seat_set:self.seat_list.append(n-1)self.seat_set.add(n-1)return n-1 self.seat_list.insert(0,0)self.seat_set.add(0)return 0 def leave(self, p: int) -> None:self.seat_list.remove(p)self.seat_set.remove(p)

標準解法:

class ExamRoom:def __init__(self, n: int): self.heap_info = [] self.last = n - 1heappush(self.heap_info, [-self.last, -1, self.last + 1]) def seat(self) -> int:gap, left, right = heappop(self.heap_info)if left < 0:if right > self.last:heappush(self.heap_info, [-self.last, 0, right])elif right > 1:heappush(self.heap_info, [-(right >> 1), 0, right]) return 0elif right > self.last:if gap < -1:heappush(self.heap_info, [-(-gap >> 1), left, self.last]) return self.lastelse:seat_idx = left - gapif gap < -1:heappush(self.heap_info, [-(-gap >> 1), left, seat_idx]) heappush(self.heap_info, [-((right - seat_idx) >> 1), seat_idx, right])elif left + 3 == right:heappush(self.heap_info, [-1, seat_idx, right]) return seat_idxdef leave(self, p: int) -> None:if p == 0:right = 1for i in range(len(self.heap_info)):if self.heap_info[i][1] == 0:_, _, right = self.heap_info.pop(i)breakheappush(self.heap_info, [-right, -1, right]) elif p == self.last:left = p - 1for i in range(len(self.heap_info)):if self.heap_info[i][2] == self.last:_, left, _ = self.heap_info.pop(i)breakheappush(self.heap_info, [left - self.last, left, self.last + 1]) else:cnt = 0left, right = p - 1, p + 1for i in range(len(self.heap_info) - 1, -1, -1):if self.heap_info[i][1] == p:_, _, right = self.heap_info.pop(i)if cnt == 1:breakcnt = 1 elif self.heap_info[i][2] == p:_, left, _ = self.heap_info.pop(i)if cnt == 1:breakcnt = 1 if left < 0:gap = rightelif right > self.last:gap = self.last - leftelse:gap = (right - left) >> 1heappush(self.heap_info, [-gap, left, right]) return None

python的heappush和heappop:
1.heappush(heap,item)建立大、小根堆
heapq.heappush()是往堆中添加新值,此時自動建立了小根堆
不能直接建立大跟堆,所以每次push時給元素加一個負號(即取相反數),此時最小值變最大值,反之亦然,那么實際上的最大值就可以處于堆頂了,返回時再取負即可。
2.heapq.heappop()從堆中彈出并返回最小的值
普通list(即并沒有進行heapify等操作的list),對他進行heappop操作并不會彈出list中最小的值,而是彈出第一個值。
對于小跟堆,會依次彈出最小的值。

x>>1相當于快速的x//2

原文鏈接:https://blog.csdn.net/qq_38022469/article/details/123851001

其他解答:
區間的左右兩邊用有序列表存儲,元素是一個元組,排序的key是計算距離的負數,這樣可以確保大的值排在前面,第二個排序依據是x[0]就是區間的左邊位置,確保先坐序號小的
這樣seat的時候就相當于刪除了原來的區間,把其分割為兩個新的區間。
兩個字典存放的是當前學生左右兩邊的學生,方便刪除的時候合并區間,這個比較好懂一些

from sortedcontainers import SortedListclass ExamRoom:def __init__(self, n: int):def dist(x):l, r = xreturn r - l - 1 if l == -1 or r == n else (r - l) >> 1self.n = nself.ts = SortedList(key=lambda x: (-dist(x), x[0]))self.left = {}self.right = {}self.add((-1, n))def seat(self) -> int:s = self.ts[0]p = (s[0] + s[1]) >> 1if s[0] == -1:p = 0elif s[1] == self.n:p = self.n - 1self.delete(s)self.add((s[0], p))self.add((p, s[1]))return pdef leave(self, p: int) -> None:l, r = self.left[p], self.right[p]self.delete((l, p))self.delete((p, r))self.add((l, r))def add(self, s):self.ts.add(s)self.left[s[1]] = s[0]self.right[s[0]] = s[1]def delete(self, s):self.ts.remove(s)self.left.pop(s[1])self.right.pop(s[0])

作者:lcbin
鏈接:https://leetcode.cn/problems/exam-room/solution/by-lcbin-tstp/
來源:力扣(LeetCode)

總結

以上是生活随笔為你收集整理的Leetcode考场就坐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。