LeetCode之二分查找

852. 山脉数组的峰顶索引

在这里插入图片描述

思路:一开始理解错误了…仔细看了下题目发现很简单嘛。可以直接扫描,也可以用效率更高的二分查找.

扫描:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& A) {
        int res = 1;
        while (A[res - 1] < A[res]) ++res;
            ;   //NULL
        return res - 1;
	}
};

时间复杂度:O(n)

二分查找:

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& A) {
        int left = 0, right = A.size() - 1;
        int mid = 0;
        while (left < right)
        {
            mid = (left + right) >> 1;
            if (A[mid - 1] < A[mid] && A[mid] > A[mid + 1])
                return mid;
            if (A[mid - 1] < A[mid])
                left = mid;
            else
                right = mid;
        }
        return right;
	}
};

时间复杂度:O(mlogN)

1351. 统计有序矩阵中的负数

在这里插入图片描述

思路:矩阵中没列都是一个有序的序列,因此可以考虑用二分查找,后缀倒序遍历,但从算法总体效率以及稳定性而言二分查找显然更胜一筹。

class Solution {
public:
	int countNegatives(vector<vector<int>>& grid) {
		int total = 0;
		size_t hi = 0;
		size_t lo = 0;
		for (auto subGrid : grid)
		{
			hi = subGrid.size();
			int res = binSearch(subGrid, -1, lo, hi);   //注意,这里必须要为-1不能是0.
			total += hi - res - 1;
		}
		return total;
	}
	//在有序区间[lo,hi)进行查找,并返回不大于e的最后一个元素的位置
	int binSearch(vector<int>& vec, int const& e, vector<int>::size_type lo, vector<int>::size_type hi)
	{
		size_t count = 0;
		while (lo < hi)		//lo == hi时退出,区间也缩减至0
		{
			int mid = lo + (hi - lo >> 1);				//以中点为界限,作为后续选择以左右那个子区间的条件
			!(e < vec[mid]) ? hi = mid : lo = mid + 1;	//深入子区间[lo ,mid) or (mid, hi),注意省略mid是符合语义的
		}												//循环退出时lo == hi,且此时lo刚好指向大于e的所有元素中的最小者
		return --lo;									//lo - 1返回不大于e的最后一个元素的位置
	}
};

时间复杂度:O(m*log n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值