zoukankan      html  css  js  c++  java
  • 二分法模板:leetcode35、leetcode74

    一、闭合区间模板

    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;
    }
    
    
  • 相关阅读:
    Linux
    bzoj 1834
    bzoj 1002 找规律(基尔霍夫矩阵)
    bzoj 1005 组合数学 Purfer Sequence
    bzoj 1601 最小生成树
    bzoj 1001 平面图转对偶图 最短路求图最小割
    bzoj 1192 二进制
    bzoj 1012 基础线段树
    bzoj 1044 贪心二分+DP
    bzoj 1011 近似估计
  • 原文地址:https://www.cnblogs.com/HZL2017/p/14599667.html
Copyright © 2011-2022 走看看