当前位置: 首页 > news >正文

【leetcode】二分查找专题

文章目录

  • 1.二分查找
    • 1.题目
    • 2.解题思路
    • 3. 解题代码
  • 2.在排序数组中查找元素的第一个和最后一个位置
    • 1.题目
    • 2.算法原理
    • 3. 代码
  • 3.x的平方根
    • 1.题目
    • 2.代码
  • 4.搜索插入位置
    • 1.题目
    • 2.解题思路
    • 3.解题代码
  • 5.山脉数组的索引
    • 1.题目
    • 2.解题思路
    • 3. 代码
  • 6.寻找峰值
    • 1.题目
    • 2.解题思路
    • 3.代码
  • 7. 寻找旋转排序数组中的最小值
    • 7.1 题目
    • 7.2 解题思路
    • 7.3 代码
  • 8.0~n-1中缺失的数字
    • 1.题目
    • 2.思路
    • 3.代码

1.二分查找

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.解题思路

在这里插入图片描述

3. 解题代码

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

2.在排序数组中查找元素的第一个和最后一个位置

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.算法原理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 代码

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int n = nums.size(), left = 0, right = n - 1;
        if(n == 0) return {-1, -1};
        // 查找左端点
        while(left < right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] < target) left = mid + 1;
            else right = mid;
        }
        if(nums[left] != target) return {-1, -1};
        int left1 = left;
        right = n - 1;
        //找右端点
        while(left < right)
        {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] <= target) left = mid;
            else right = mid - 1;
        }
        return {left1, left};
    }
};

3.x的平方根

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.代码

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

4.搜索插入位置

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.解题思路

在这里插入图片描述

3.解题代码

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

5.山脉数组的索引

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.解题思路

在这里插入图片描述

3. 代码

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

6.寻找峰值

1.题目

题目链接
在这里插入图片描述
在这里插入图片描述

2.解题思路

在这里插入图片描述

3.代码

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

7. 寻找旋转排序数组中的最小值

7.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

7.2 解题思路

在这里插入图片描述

7.3 代码

class Solution {
public:
    int findMin(vector<int>& nums) {
       int left = 0, n = nums.size(), right = n - 1;
       while(left < right)
       {
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[right]) left = mid + 1;
            if(nums[mid] <= nums[right]) right = mid;
       }
       return nums[left];
    }
};
// 原来看题解的代码
class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = -1;
        int right = nums.size() - 1;
        while(left + 1 < right)
        {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums.back())
            {
                right = mid;
            }
            else
            {
                left= mid;
            }
        }
        return nums[right];
    }
};

8.0~n-1中缺失的数字

1.题目

(剑指offer的题目,所以不能免费做题)
在这里插入图片描述

2.思路

在这里插入图片描述
在这里插入图片描述

3.代码

在这里插入图片描述

相关文章:

  • 打造爆款秘籍:利用ARA数据优化亚马逊广告策略
  • STM32呼吸灯实验手册(TIM定时器)
  • Linux网络 数据链路层
  • StableDiffusion打包 项目迁移 项目分发 1
  • 《深度学习实战》第5集:生成对抗网络(GAN)与图像生成
  • 矩阵系列 题解
  • Spring的@Configuration注解:深入解析与实战指南
  • spring--ApplicationContext和BeanFactory的区别(源码)
  • MYSQL数据库创建命令
  • 深入解析/etc/hosts.allow与 /etc/hosts.deny:灵活控制 Linux 网络访问权限
  • MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置
  • 电路中如何计算电容容值大小
  • 013作用域
  • php特性
  • c++ 中的容器 vector 与数组 array
  • wzl-django学习
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_buf_t
  • MAVEN的安装和配置指南【超详细】
  • 《Web安全渗透测试实战:DVWA靶场全关卡通关指南(高/中/低/不可能级别)|手把手教你掌握漏洞挖掘与渗透技巧》
  • 图像仿射变换
  • 厦门网站建设680/常用的关键词挖掘工具有哪些
  • 建网站 外贸/企业网站建设规划
  • 长沙网站平台建设公司/搜索引擎优化搜索优化
  • 做网站的论文摘要/网络营销品牌推广
  • 牛牛襄阳做网站/网络销售工作靠谱吗
  • 学生管理系统网站/邯郸seo优化