二进制搜索程序导致运行时错误和失败的隐藏测试用例

Binary search program cause runtime error and failed hidden test cases

我正在用 problem 704 on leetcode 练习二进制搜索。起初,我只是遵循二进制搜索的概念并想出了这个解决方案:

int search(int* nums, int numsSize, int target){
    size_t start=0, end=numsSize-1;
    while(start!=end){  // if start == end then break
        if(nums[(start+end)/2] > target){
            end=(start+end)/2;
        }
        else if(nums[(start+end)/2] < target){
            start=(start+end)/2+1;
        }
        else{
            return (start+end)/2;
        }
    }        
    if(nums[start]==target){    // when start == end
        return start;
    }       
    return -1;
}

它的设计不是很好,但它通过了所有测试用例。

之后看了一些二分查找的文章,尝试用这段代码重新实现:

int search(int* nums, int numsSize, int target){
    size_t start=0, end=numsSize-1;
    while(start<=end){
        size_t mid = (start+end)/2;
        if(nums[mid]==target){
            return mid;
        }
        else if(nums[mid] > target){
            end=mid-1;
        }
        else{
            start=mid+1;
        }
    }
    return -1;
}

问题是它只通过了 3/47 个测试用例并导致运行时错误。

为什么我的第二个版本会出错,而我的第一个版本却不会。

如有任何帮助,我们将不胜感激。

你的第二个实现唯一的错误是使用 size_t。将其更改为 int,它应该可以正常工作。

size_t 是无符号类型。当搜索探测数组的开头时,end 的值可以为负。这会调用 C 中的未定义行为。实际上,这通常意味着值“下溢”并变成一个巨大的正数。

这是我的非常简短的版本:

int search(int* nums, int numsSize, int target){
    int lo=0;
    int hi=numsSize-1;
    
    int* x[]= {&lo, &hi};
    while(hi-lo>1)
    {
        int mid=lo+(hi-lo)/2;
        if (nums[mid]==target) return mid;
        *x[nums[mid]>target] = mid;
    }
    
    return (nums[lo]==target)? lo:
           (nums[hi]==target)? hi: -1; 
}