码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LeetCode热题100——二分查找


    二分查找

    • 1. 搜索插入位置
    • 2. 搜素二维矩阵
    • 3. 在排序数组中查找第一个和最后一个元素位置

    1. 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    // 题解:
    int searchInsert(vector<int>& nums, int target) {
    	if (nums.empty()) {
    		return 0;
    	}
    	int left = 0;
    	int right = nums.size() - 1;
    	while (left < right) {
    		int mid = (left + right) >> 1;
    		if (nums[mid] < target) {
    			left = mid + 1;
    		} else {
    			right = mid;
    		}
    	}
    	return right ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2. 搜素二维矩阵

    给你一个满足下述两条属性的 m x n 整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。
    给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
    在这里插入图片描述

    // 题解:按照行和最后一列遍历,对row和col加减
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
    	if (matrix.empty()) return false;
    	int rows = matrix.size();
    	if (matrix[0].empty()) return false;
    	int cols = matrix[0].size();
    	
    	int row = 0;
    	int col = cols - 1;
    	while (col < cols && col >= 0 && row < rows && row >= 0) {
    		if (matrix[row][col] < target) row++;
    		else if (matrix[row][col] > target) col--;
    		else return true;
    	}
    	return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
    如果数组中不存在目标值 target,返回 [-1, -1]。
    输入:nums = [5,7,7,8,8,10], target = 8
    输出:[3,4]

    // 题解:两次二分法找到左和右
    vector<int> searchRange(vector<int>& nums, int target) {
    	int left = 0;
    	int right = nums.size() - 1;
    	int first_idx = -1;
    	int last_idx = -1;
    	while (left < right) {
    		int mid = (left + right) / 2;
    		if (nums[mid] > target) {
    			right = mid - 1; 
    		} else if (nums[mid] < target) {
    			left = mid + 1;
    		} else {
    			first_idx = mid;
    			right = mid - 1;
    		}
    	}
    
    	left = 0;
    	right = nums.size() - 1;
    	while (left < right) {
    		int mid = (left + right) / 2;
    		if (nums[mid] > target) {
    			right = mid - 1;
    		} else if (nums[mid] < target) {
    			left = mid + 1;
    		} else {
    			last_idx = mid;
    			left = mid + 1;
    		}
    	}
    	return {first_idx, last_idx};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    【车载Android】模拟Android系统的高负载环境
    【滤波估计】基于双卡尔曼滤波实现soc和soh联合估计附matlab代码
    C语言结构体详解:定义、初始化和指针使用
    【Linux】gdb调试
    【已解决】EOFError: Ran out of input
    MySQL数据库安装配置保姆级教程(以8.0.29为例)有手就行
    亮相2022南京软博会,创邻科技携Galaxybase图平台展现信创硬核实力
    【CSDN】markdown实用语法
    计算lnx的一种方式
    概率图模型在机器学习中的应用:贝叶斯网络与马尔可夫随机场
  • 原文地址:https://blog.csdn.net/qq_37568167/article/details/134451553
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号