记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 9/1 1792. 最大平均通过率
- 9/2 3025. 人员站位的方案数 I
- 9/3 3027. 人员站位的方案数 II
- 9/4 3516. 找到最近的人
- 9/5 2749. 得到整数零需要执行的最少操作数
- 9/6 3495. 使数组元素都变为零的最少操作次数
- 9/7 1304. 和为零的 N 个不同整数
9/1 1792. 最大平均通过率
提高平均通过率
尽量进入加一人通过率提高最多的班级
heap存放通过率提高量
def maxAverageRatio(classes, extraStudents):""":type classes: List[List[int]]:type extraStudents: int:rtype: float"""def cal(p,t):return 1.0*(p+1)/(t+1)-1.0*p/timport heapqh = []total = 0for p,t in classes:total += 1.0*p/th.append((-cal(p,t),p,t))heapq.heapify(h)for _ in range(extraStudents):v,p,t = heapq.heappop(h)total -= vheapq.heappush(h, (-cal(p+1,t+1),p+1,t+1))return total/len(classes)
9/2 3025. 人员站位的方案数 I
A=x1,y1 B=x2,y2
横坐标从小到大排序 满足前面的点在后面的点左侧
满足y1>=y2
对于中间的点 需要 y>y1 或 y<y2
遍历时记录右下的最大maxy
def numberOfPairs(points):""":type points: List[List[int]]:rtype: int"""points.sort(key=lambda x:(x[0],-x[1]))ans=0for i,(_,y1) in enumerate(points):maxy=float('-inf')for _,y2 in points[i+1:]:if y1>=y2>maxy:maxy=y2ans+=1return ans
9/3 3027. 人员站位的方案数 II
A=x1,y1 B=x2,y2
横坐标从小到大排序 满足前面的点在后面的点左侧
满足y1>=y2
对于中间的点 需要 y>y1 或 y<y2
遍历时记录右下的最大maxy
def numberOfPairs(points):""":type points: List[List[int]]:rtype: int"""points.sort(key=lambda x:(x[0],-x[1]))ans=0for i,(_,y1) in enumerate(points):maxy=float('-inf')for _,y2 in points[i+1:]:if y1>=y2>maxy:maxy=y2ans+=1return ans
9/4 3516. 找到最近的人
计算两人到z的距离
def findClosest(x, y, z):""":type x: int:type y: int:type z: int:rtype: int"""d1=abs(x-z)d2=abs(y-z)if d1>d2:return 2elif d1<d2:return 1else:return 0
9/5 2749. 得到整数零需要执行的最少操作数
def makeTheIntegerZero(num1, num2):""":type num1: int:type num2: int:rtype: int"""k=1while True:x=num1-num2*kif x<k:return -1if k>=x.bit_count():return kk+=1
9/6 3495. 使数组元素都变为零的最少操作次数
除以4等同于 二进制右移两位
对于一个二进制x位的数 需要操作(x+1)//2次
累加所有数操作次数 除以2
find(num)累加1~num的所有操作次数
def minOperations(queries):""":type queries: List[List[int]]:rtype: int"""def find(num):i=1base=1cnt=0while base<=num:cnt+=((i+1)//2)*(min(base*2-1,num)-base+1)i+=1base*=2return cntans=0for q in queries:ans+=(find(q[1])-find(q[0]-1)+1)//2return ans
9/7 1304. 和为零的 N 个不同整数
n为奇数则添加一个0 然后-x,x成对添入
def sumZero(n):""":type n: int:rtype: List[int]"""ans=[]if n%2==1:ans=[0]for i in range(1,n//2+1):ans.append(-i)ans.append(i)return ans