二分法-Leetcode

这篇博客探讨了在LeetCode中使用二分法解决不同类型的问题,包括整数相除(29. Divide Two Integers)、寻找目标值的范围(34. Search for a Range)、指数计算(50. Pow(x, n))、平方根求解(69. Sqrt(x))、二维矩阵搜索(74. Search a 2D Matrix)以及找到数组中的峰值元素(162. Find Peak Element)。通过分析和展示简洁的代码实现,阐述了二分法在不同场景下的高效运用。" 115882761,10539497,MATLAB在数字电路仿真的应用与技巧,"['MATLAB仿真', '数字电路设计', '电路验证', '电路调试', '电路仿真']
摘要由CSDN通过智能技术生成

29. Divide Two Integers

整数相除,不能用除法或者乘法或者取模。如果溢出,返回INT_MAX。
重点:左移乘2:<<
思路:这里模拟整数相除,本质就是计算一个被除数包括多少个除数,这包含多少个,如果一个个累加肯定是太慢了,可以考虑二分的思路,两倍两倍来计算,利用位运算,每一步移位来计算。这里还需要注意的两个问题,一个是溢出,一个是符号。溢出考虑两种情况:

divisor = 0;
dividend = INT_MIN and divisor = -1
(because abs(INT_MIN) = INT_MAX + 1).

符号计算:

int flag = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
        long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0;
        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
        if (n == 1) return sign == 1 ? m : -m;
        while (m >= n) {
            long long t = n, p = 1;
            while (m >= (t << 1)) {
                t <<= 1;
                p <<= 1;
            }
            res += p;
            m -= t;
        }
        return sign == 1 ? res : -res;
    }
};

34. Search for a Range

升序序列中,找到目标值的起始位置和终止位置。时间复杂度O(logn)
二分查找,找到后左右移动

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2, -1);
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值