使用二进制搜索找到kthsmallestnumber-只读数组

时间:2019-05-18 02:00:37

标签: binary-search

问题: “在只读数组中找到第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

0 个答案:

没有答案