leetcode 二分题 C++实现 (未完

有两种区间的分法:

把数组分成三个区间,[left,mid-1] mid [mid+1,right],使用这种写法通常的情况是要找的元素的性质比较简单,直接。

把数组分成两个区间[left,mid] [mid+1,right]或[left,mid-1] [mid,right],把区间分成“一定不存在目标元素的区间”和“可能存在目标元素的区间”,适合于元素的性质比较复杂的题目。

 

简单题:

704. 二分查找

时间复杂度o(logn),空间复杂度o(1)

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

  

35. 搜索插入位置

时间复杂度o(logn),空间复杂度o(1)

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

  

69. x 的平方根

时间复杂度o(logn),空间复杂度o(1)

class Solution {
public:
    int mySqrt(int x) {
        int left = 0, right = x;
        int res;
        while(left <= right)
        {
            int mid = (left + right) / 2;
            
            if((long long)mid * mid <= x)
            {
                res = mid;
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        return res;
    }
};

 

两区间法要注意,这里的mid要向上取整,否则会陷入死循环。

时间复杂度o(logn),空间复杂度o(1)

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0 || x == 1)
            return x;
        long long left = 1, right = x / 2;

        while(left < right)
        {
            int mid = left + (right - left + 1) / 2;
            
            if(mid > (x / mid))
            {
                right = mid - 1;
            }
            else
            {
                left = mid;
            }
        }
        return left;
    }
};

  

中等题

633. 平方数之和

时间复杂度o(sqrt(c)),空间复杂度o(1)

class Solution {
public:
    bool judgeSquareSum(int c) {
        long long left = 0, right = sqrt(c);
        while(left <= right)
        {
            if((left * left + right * right) == c)
            {
                return true;
            }
            else if((left * left + right * right) < c)
            {
                left++;
            }
            else
            {
                right--;
            }
        }
        return false;
    }
};

 

 

 

参考资料:

写对二分查找不能靠模板,需要理解加练习 (附练习题,持续更新)

 

posted @ 2021-07-11 17:00  Jessica_xyx  阅读(57)  评论(0)    收藏  举报