关于力扣第 167 场双周赛的赛后总结 第三四题
第三题 我赛时写的太过于繁琐
class ExamTracker:def __init__(self):self.pre = [0]self.dic = {0:0}self.cnt = 1self.has = []def record(self, time: int, score: int) -> None:self.dic[time] =self.cnt self.pre.append(score +self.pre[-1])self.has.append(time)self.cnt += 1 def totalScore(self, startTime: int, endTime: int) -> int:s = bisect_left(self.has,startTime)e = bisect_left(self.has,endTime)cs = self.dic[self.has[s]]if self.has[e] == endTime: ce = self.dic[self.has[e]]else:if e >= 1:ce = self.dic[self.has[e-1]]else:ce = 0# print(e,cs,ce,self.pre,self.has)return max(0,self.pre[ce] - self.pre[cs-1]) # Your ExamTracker object will be instantiated and called as such:
# obj = ExamTracker()
# obj.record(time,score)
# param_2 = obj.totalScore(startTime,endTime)
其实直接维护一个前缀和数组就行,然后区间搜索的话,左边界bisect_left右边界bisect_right就行。(粘贴的灵神代码)
class ExamTracker:def __init__(self):self.times = []self.pre_sum = [0]def record(self, time: int, score: int) -> None:self.times.append(time)self.pre_sum.append(self.pre_sum[-1] +score)def totalScore(self, startTime: int, endTime: int) -> int:left = bisect_left(self.times,startTime)right = bisect_right(self.times,endTime)return self.pre_sum[right] - self.pre_sum[left] # Your ExamTracker object will be instantiated and called as such:
# obj = ExamTracker()
# obj.record(time,score)
# param_2 = obj.totalScore(startTime,endTime)
来到第四题,这题我赛时没出,一些细节没有理明白
我想到了二分,但是很久没有复习二分图的经典算法 ,所以没出。
复习二分图板子如下:
class Solution:def isBipartite(self, graph: List[List[int]]) -> bool:colors = [0]*len(graph)def dfs(x,c):colors[x] = c for y in graph[x]:if colors[y] ==c or colors[y] == 0 and not dfs(y,-c):return False return True for i,c in enumerate(colors):if c == 0 and not dfs(i,1):return Falsereturn True
对于该算法,采用交替染色的思路,0是没有染色,1和-1交替染色,一旦发现有同色的,因为在二分图构建过程中,相遇同色节点必定有共同异色节点,无法使该节点集合分为两个互相连接而内部没有连接的二分图。
故把二分图板子构建进去,然后二分一下就行了。
class Solution:def maxPartitionFactor(self, points: List[List[int]]) -> int:if len(points) == 2:return 0 def check(low):colors = [0]*len(points)def dfs(x,c):colors[x] = cx1,y1 = points[x]for y,(x2,y2) in enumerate(points):if y == x or abs(x1 - x2) +abs(y1 - y2) >= low:continue if colors[y] == c or colors[y] == 0 and not dfs(y,-c):return Falsereturn True for i,c in enumerate(colors):if c == 0 and not dfs(i,1):return False return True max_dis = max(abs(x1 - x2) +abs(y1-y2) for (x1,y1),(x2,y2) in combinations(points,2))left = 0right = max_dis +1while left +1 < right:mid = (left + right)>>1if check(mid):left = mid else:right = mid return left
(学习的灵神代码)
总结:看到要将集合分为两部分,想到二分图。