最优的情况,我们得到了刚刚好len(nums)//2对下标对,对与一般情况,我们可以将其分为两个数组S1(小值数组)和S2(大值数组),当我们让S1中的min与S2中的min来进行比较时,是没有浪费的,下图中我们K的范围是[0,2]
我们可以先
nums.sort()
#注意此处right已经是一半了
left,right=0,len(nums)//2+1
while left < right:
mid = (left + right + 1) // 2
if check(mid):
left = mid
else:
right = mid - 1
然后写check(k)函数:
def check(k):
for i in range(k):
if nums[i]*2>nums[len(nums)-k+i]:#nums[len(nums)-k+i]为S2中对应位置的元素
return False
return True
上面的nums[len(nums)-k+i]是对应了上面图片里5的位置
故完整代码为:时间复杂度O(NLogN)
class Solution:
def maxNumOfMarkedIndices(self, nums: List[int]) -> int:
nums.sort()
left,right=0,len(nums)//2
def check(k):
for i in range(k):
if nums[i]*2>nums[len(nums)-k+i]:
return False
return True
while left<right:
mid = (left + right + 1) // 2
if check(mid):
left=mid
else:
right=mid-1
return left*2