classSolution: deffindTheDistanceValue(self, arr1: List[int], arr2: List[int], d: int) -> int: # 时间nlogn,主要是排序;空间1 arr2.sort() # 让1的元素a在2中没有周围d以内的,可以转化为找a-2和a+2在arr2的所属位置,如果能找到范围内数字就不符合距离要求 ans = 0 for a in arr1: # 这是直接排除最极端的情况,加速 if a+d < arr2[0] or a-d > arr2[-1]: ans += 1 continue target_low_idx = bisect_left(arr2, a-d) # 第一种情况是极端情况,虽然排除了,但还是先写着 # 第二种就是大于等于a-d的第一个元素在【a-d,a+d】这个区间中,就不符合距离要求了,不需要另一个坐标 if target_low_idx < len(arr2) and arr2[target_low_idx] > a + d: ans += 1 return ans
classSolution: defhIndex(self, citations: List[int]) -> int: # 暴力做法是从高往低遍历,求已遍历数字长度和当前数字值取小值 # 想要对数时间复杂度,就需要二分取数字长度 n = len(citations) l = 0 r = n while l <= r: mid = (l+r) // 2 # if n-mid <= citations[mid]: # 说明从这往右的都满足大于自己的位置长度(末尾起算) # r = mid-1 # else: # l = mid+1 if citations[-mid] >= mid: # 右边mid篇文章至少有mid引用 l = mid+1 else: r = mid-1 return r
classSolution: defminimizeArrayValue(self, nums: List[int]) -> int: # 假定存在数字h符合题目的最小的那个最大值,那么可以设置一个数字去逼近h # 时间logn,空间 1 l = 0 r = max(nums) n = len(nums) while l <= r: mid = (l+r)//2 cur = 0 for i inrange(n-1, -1, -1): cur = max(0, cur+(nums[i]-mid)) if cur > 0: # 不满足条件,需要增大这个最大值的量 l = mid+1 else: r= mid-1 return l