zoukankan      html  css  js  c++  java
  • 二分查找--考虑target不在查询数组内的情况

    1. 二分查找

    class Solution {
    public:
        /**
         * 二分查找
         * @param n int整型 数组长度
         * @param v int整型 查找值
         * @param a int整型vector 有序数组
         * @return int整型
         */
        // 查找左边界
        int upper_bound_(int n, int v, vector<int>& a) {
            // write code here
            // 搜索区间左闭右开,[left, right)
            int left = 0; // 左边界,数组中的最大值元素
            int right = n-1; 	// 右边界,数组长度
            // 循环条件,左边界小于右边界
            while(left < right){
                int mid = left+(right-left)/2;
                // mid值大于目标值,右边界向左收缩
                if (a[mid] >= v) {
                    // 当mid==0,即查找到数组起始位置,不能再继续循环,故此时退出
                    // 当a[mid-1]<v且a[mid] >= v,此时可认为mid即是target的索引位置
                    if (mid == 0 || a[mid-1]<v) return mid+1;
                    else
                        right = mid;	//目标数target在左半幅,将下一次数组查询的右边界改为mid
                }
                // mid值小于目标值,左边界向右扩张
                else
                    left = mid +1;
                // 传统方法
                // 符合条件时不立即返回,继续收缩右侧边界,锁定左侧边界
                //else if (a[mid]==v) {
                //    right = mid;
                //}
            }
            return n+1;
        }
    };
    
  • 相关阅读:
    哈希表(hash)
    并查集
    trie树(字典树)
    单调队列(滑动窗口)
    单调栈
    用数组实现栈与队列
    数组实现双链表
    数组实现单链表
    区间合并
    离散化
  • 原文地址:https://www.cnblogs.com/litchi99/p/13724695.html
Copyright © 2011-2022 走看看