IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode解题系列(12) -> 正文阅读

[数据结构与算法]leetcode解题系列(12)

69.x的平方根

题目描述:

在这里插入图片描述
方法一:二分查找:

class Solution {
public:
    int mySqrt(int x) {
        int l = 0, r = x, ans = -1;
        while (l <= r) {
            int mid = l + (r - l) / 2;//-1是想实现向下取整
            //也可以写成:int mid=(l+r)/2.0
            if ((long long)mid * mid <= x) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return ans;
    }
};

这里在二分法中,需要注意的是:
(1)mid的更新方式,具体是(l+r)/2.0还是(l+r-1)/2等等,根据具体需要决定;
(2)while中的条件语句:实验过,当使用while(l<r)时就无法通过,也就是说一定需要l>r时才可以跳出这个循环,因为当l=r时有可能还没有找到最终的ans,如果需要再次调整l,则这个才是ans
(3)更新ans的时机:修改l的时候就记录一下,最后一个记录的值就是真的ans;
方法二:牛顿迭代法

class Solution {
public:
    int mySqrt(int a) {
long x = a;
while (x * x > a) {
x = (x + a / x) / 2;
}
return x;
}
};

在这里插入图片描述

二分法,代码如下:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty())return vector<int>{-1,-1};
        int lower=lower_bound(nums,target);
        int upper=upper_bound(nums,target)-1;
        if(lower==nums.size()||nums[lower]!=target){
            return vector<int>{-1,-1};
        }
        return vector<int>{lower,upper};
    }

    int lower_bound(vector<int>&nums,int target){
        int l=0,r=nums.size(),mid;
        while(l<r){
            mid=(l+r)/2;
            if(nums[mid]>=target){
                r=mid;
            }else{
                l=mid+1;
            }
        }
        return l;
    }

    int upper_bound(vector<int>&nums,int target){
        int l=0,r=nums.size(),mid;
        while(l<r){
            mid=(l+r)/2;
            if(nums[mid]>target){
                r=mid;
            }else{
                l=mid+1;
            }
            
        }
        return l;
    }
};

二分查找中还是对一些细节不是非常理解,比如什么时候要用等号,什么时候要加一…

题目描述:

在这里插入图片描述
思路:使用二分查找的思路,但是二分的前提就是需要一个sorted的序列,所以首先需要判断排好序的数组;
首先将mid对应的元素与右端相比较,≤右端值时,说明mid到r之间的数组是增序排列的,可以直接使用二分查找(当然是target在区间内的,否则只能在左区间查找);大于右端值时,说明左区间是排好序的,用类似思路可以解决;
当遇到上述target处于非增序部分时,就可以递归地解决问题,因为舍弃掉排序区间后,得到的还是一个翻转数组,可以递归地解决这个问题;

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int start=0,end=nums.size()-1;//定义头尾
        while(start<=end){
            int mid=(start+end)/2;
            if(nums[mid]==target){
                return true;
            }

            if(nums[start]==nums[mid]){
                //无法判断哪个区间是增序的
                ++start;
            }else if(nums[mid]<=nums[end]){
                //右区间是增序的
                if(target>nums[mid]&&target<=nums[end]){
                    //如果target在这个区间中
                    start=mid+1;//修改区间
                }else{
                    end=mid-1;
                }
            }else{
                //左区间是增序的
                if(target>=nums[start]&&target<nums[mid]){
                    end=mid-1;
                }else{
                    start=mid+1;
                }
            }
        }
        return false;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:53:24  更:2021-08-12 16:58:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:41:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码