问题: “在只读数组中找到第k个最小数字,而无需修改原始数组”
在以下论坛中发布的一种解决方案在测试多个重复项时失败。有什么建议么 ? How to find the Kth smallest integer in an unsorted read only array?
对于以下测试用例,在有重复的情况下,二进制搜索方法失败:
def kthsmallestUsingBinarySearch(a, k):
if(a == None or len(a) == 0):
print("Not valid array")
lo = min(a);
hi = max(a);
while(lo <= hi):
mid = int(lo + (hi - lo)/2);
print("low: {0} and high : {1} and mid:{2}".format(lo,hi,mid))
countLess = countEqual = 0
for i in range(0,len(a)):
print("{0} <= {1}".format(a[i],mid))
if(a[i] < mid):
countLess +=1
elif(a[i] == mid):
countEqual +=1
if(countLess >= k):
break
if(countLess < k and countLess + countEqual >= k):
print("The mid element is :{}".format(mid))
return mid
elif(countLess >= k):
hi = mid - 1
else:
lo = mid + 1
return -1
可以正常工作而不会出现重复。
<----正确的输入结果不带重复:---->
1.1使用二进制搜索,[10、1、5、3、0、6、11]中的2个最小元素为:1
1.2使用二进制搜索,[10、2、5、3、0、6、11]中的3个最小元素为:3
<------测试用例失败:---->
2.1使用二进制搜索,[10,4,4]中的2个最小元素为:4
2.2使用二进制搜索,[10,4,4,2,2,2,1]中的4个最小元素为:2
2.3使用二进制搜索,[3、2、3、1、2、4、5、5、6]中的4个最小元素为:3