查找算法:二分法实现过程

一、闭合区间模板

int binarySearch(int* nums, int numsSize, int target)
{
    int begin = 0;
    int end = numsSize - 1;
    int mid;

    while (begin <= end) {
        mid = (begin + end) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] > target) {
            end = mid - 1;
        } else if (nums[mid] < target) {
            begin = mid + 1;
        }
    }

    // 未找到
    return -;

}

二、关键点分析

1、初始值:闭区间模板,自然是包括[begin, end],end的大小为数组长度-1;

2、while循环条件:由于为闭区间,所以begin和end均可能取到,其重合时也可能会取到,因此需要begin<=end;

3、中间值mid:此处简单的平均begin和end即可,不需要多余处理(不会溢出);

4、目标值大于中间值:目标值在右半区间,即[mid, end],由于mid已经判断过了,后续无须再次判断,因此判断区间为[begin=mid+1, end];

5、目标值小于中间值:目标值在左半区间,即[begin, mid], 由于mid已经判断过了,区间改成[begin, end=mid-1]

三、leetcode35:搜索插入位置

int searchInsert(int* nums, int numsSize, int target)
{
    int begin = 0;
    int end = numsSize - 1;
    int mid;

    while (begin <= end) {
        mid = (begin + end) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] > target) {
            end = mid - 1;
        } else if (nums[mid] < target) {
            begin = mid + 1;
        }
    }

	// 当数组中无该数时,进行处理
    return nums[mid] < target ? mid + 1 : mid;
}


四、leetcode74:搜索二维矩阵

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
    int begin = 0;
    int end =  matrixSize * (*matrixColSize) - 1;
    int mid;
    int midVal;
    
    while (begin <= end) {
        mid = (begin + end) / 2;
        // 二维数组索引转换
        midVal = matrix[mid / (*matrixColSize)][mid % (*matrixColSize)];
        if (midVal == target) {
            return true;
        } else if (midVal > target) {
            end = mid - 1;
        } else {
            begin = mid + 1;
        }
    }

    return false;
}

posted @ 2021-03-31 00:58  Pangolin2  阅读(101)  评论(0编辑  收藏  举报