【二分算法】

news2024/12/24 8:11:12

17. 二分查找(easy)

算法流程:

算法代码:

int search(int* nums, int numsSize, int target)
{
	// 初始化 left 与 right 指针
	int left = 0, right = numsSize - 1;
	// 由于两个指针相交时,当前元素还未判断,因此需要取等号
	while (left <= right)
	{
		// 先找到区间的中间元素
		int mid = left + (right - left) / 2;
		// 分三种情况讨论
		if (nums[mid] == target) return mid;
		else if (nums[mid] > target) right = mid - 1;
		else left = mid + 1;
	}
	// 如果程序⾛到这⾥,说明没有找到⽬标值,返回 -1
	return -1;
}

总结朴素二分模板

18. 在排序数组中查找元素的第⼀个和最后⼀个位置(medium)

算法思路:

寻找左边界思路:

寻找右边界思路:

⼆分查找算法总结:

模板记忆技巧:

C++ 算法代码:

class Solution
{
public:
	vector<int> searchRange(vector<int>& nums, int target)
	{
		// 处理边界情况
		if (nums.size() == 0) return { -1, -1 };

		int begin = 0;
		// 1. ⼆分左端点
		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;
		}

		// 判断是否有结果
		if (nums[left] != target) return { -1, -1 };
		else begin = left; // 标记⼀下左端点

		// 2. ⼆分右端点
		left = begin, right = nums.size() - 1;
		while (left < right)
		{
			int mid = left + (right - left + 1) / 2;
			if (nums[mid] <= target) left = mid;
			else    right = mid - 1;
		}
		return { begin, right };
	}
};

19. 搜索插⼊位置(easy)

解法(⼆分查找算法):

C++ 算法代码:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 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 right + 1;
        return left;
    }
};

20. x 的平⽅根(easy)

解法⼀:(暴⼒查找)

C++ 算法代码:

class Solution{
public:
 int mySqrt(int x) {
	 // 由于两个较⼤的数相乘可能会超过 int 最⼤范围
	 // 因此⽤ long long
	 long long i = 0;
	 for (i = 0; i <= x; i++)
	 {
		 // 如果两个数相乘正好等于 x,直接返回 i
		 if (i * i == x) return i;
		 // 如果第⼀次出现两个数相乘⼤于 x,说明结果是前⼀个数
		 if (i * i > x) return i - 1;
		 }
	 // 为了处理oj题需要控制所有路径都有返回值
	 return -1;
	 }
};

解法⼆(⼆分查找算法):

C++ 算法代码:

class Solution
{
public:
	int mySqrt(int x)
	{
		if (x < 1) return 0; // 处理边界情况
		int left = 1, 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;
	}
};

21. 山峰数组的峰顶(easy)

解法⼀(暴⼒查找):

算法代码:

class Solution {
public:
	int peakIndexInMountainArray(vector<int>& arr) {
		int n = arr.size();
		// 遍历数组内每⼀个元素,直到找到峰顶
		for (int i = 1; i < n - 1; i++)
			// 峰顶满⾜的条件
			if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
				return i;
		// 为了处理 oj 需要控制所有路径都有返回值
		return -1;
	}
};

解法⼆(⼆分查找):

算法代码:

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

22. 寻找峰值(medium)

解法⼆(⼆分查找算法):

C++ 算法代码:

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

23. 搜索旋转排序数组中的最⼩值(medium)

解法(⼆分查找):

C++ 算法代码:

class Solution
{
public:
	int findMin(vector<int>& nums)
	{
		int left = 0, right = nums.size() - 1;
		int x = nums[right]; // 标记⼀下最后⼀个位置的值
		while (left < right)
		{
			int mid = left + (right - left) / 2;
			if (nums[mid] > x) left = mid + 1;
			else right = mid;
		}
		return nums[left];
	}
};

24. 0〜n-1 中缺失的数字(easy)

解法(⼆分查找算法):

C++ 算法代码:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Ubuntu服务器上快速安装一个redis并提供远程服务

一、快速安装一个Redis 第一步&#xff1a;更新apt源 sudo apt update第二步&#xff1a;下载Redis sudo apt install redis第三步&#xff1a;查看Redis是否已自启动 systemctl status redis二、配置Redis提供远程服务 第一步&#xff1a;先确保6379端口正常开放 如果是…

客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题

客户端传日期格式字段&#xff08;string&#xff09;,服务端接口使用java.util.Date类型接收报错问题 问题演示第1种&#xff1a;客户端以URL拼接的方式传值第2种&#xff1a;客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决&#xff08;全局解…

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…

Qt5 编译oracle数据库

库文件 1、Qt源码目录&#xff1a;D:\Qt5\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci 2、oracle客户端SDK: https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 下载各版本中的如下压缩包&#xff0c;一定要版本相同的 将两个压缩包…

jenkins+gitlab配置

汉化 1、安装Localization: Chinese (Simplified)插件 &#xff08;此处我已安装&#xff09; &#xff08;安装完成后重启jenkins服务即可实现汉化&#xff09; 新增用户权限配置 1、安装插件 Role-based Authorization Strategy 2、全局安全配置 3、配置角色权限 4、新建…

运用单例模式思想解决RuntimeException超时问题

今天&#xff0c;排查了一个RuntimeException超时问题&#xff0c;简单记录分享下。 分析关键日志排查如下 查看关键代码 private static Client createClient(String wsdlUrl) {JaxWsDynamicClientFactory jaxWsDynamicClientFactory JaxWsDynamicClientFactory.newInstance…

ElasticView一款ElasticSearch的web可视化工具

ElasticView 是一款用来监控ElasticSearch状态和操作ElasticSearch索引的web可视化工具。它由golang开发而成&#xff0c;具有部署方便&#xff0c;占用内存小等优点 ElasticSearch连接树管理&#xff08;更方便的切换测试/生产环境&#xff09;支持权限管理支持sql转换成dsl语…

Go语言图像处理实战:深入image/color库的应用技巧

Go语言图像处理实战&#xff1a;深入image/color库的应用技巧 引言image/color库基础颜色模型简介颜色类型和接口 image/color库实际应用基本颜色操作创建颜色颜色值转换颜色比较 颜色转换与处理与image库结合使用 性能优化和高级技巧性能考量避免频繁的颜色类型转换使用并发处…

在vue3中实现pptx、word、excel预览

插件推荐 PPTXjs vue-office 代码 <script setup lang"ts" name"home"> import { computed, nextTick, ref, onMounted } from vue; //引入VueOfficeDocx组件 import VueOfficeDocx from vue-office/docx; //引入VueOfficeExcel组件 import VueOf…

探索Web3的奇迹:数字时代的新前景

在数字化时代的潮流中&#xff0c;我们不可避免地迎来了一个全新的篇章——Web3时代的到来。在这个时代中&#xff0c;区块链技术作为数字化世界的核心&#xff0c;正在重塑着我们的生活方式、经济模式以及社会结构。在Web3时代&#xff0c;我们将目睹着一个以去中心化、透明化…

Kubernetes(k8s):深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

Kubernetes&#xff08;k8s&#xff09;&#xff1a;深入理解k8s中的亲和性&#xff08;Affinity&#xff09;及其在集群调度中的应用 1、什么是亲和性&#xff1f;2、节点亲和性&#xff08;Node Affinity&#xff09;2.1 硬性节点亲和性规则&#xff08;required&#xff09;…

TCP/IP协议—UDP

TCP/IP协议—UDP UDP协议UDP通信特点 UDP头部报文UDP检验 UDP协议 用户数据传输协议 (UDP&#xff0c;User Datagram Protocol) 是一种无连接的协议&#xff0c;提供了简单的数据传输服务&#xff0c;不保证数据的顺序以及完整性。应用层很多通信协议都基于UDP进行传输&#x…

「51媒体网」汽车类媒体有哪些?车展媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 汽车类媒体有很多&#xff0c;具体如下&#xff1a; 汽车之家&#xff1a;提供全面的汽车新闻、评测、导购等内容。 爱卡汽车&#xff1a;同样是一个综合性的汽车信息平台&#xff0c;涵…

iPad 无法解锁?修复 iPad 滑动解锁不起作用的 9 个解决方案

“我的 iPad Pro 一整天都工作正常&#xff0c;直到 20 分钟前。当我解锁它时&#xff0c;它不让我向上滑动。屏幕有响应&#xff0c;但我的 iPad 无法解锁。是否有其他人遇到过这种情况并找到了解决方法&#xff1f;解决方案&#xff1f;” ——来自 Apple 支持社区 iPad 屏幕…

华媒舍:7种方式,打造出旅游媒体套餐

现如今&#xff0c;伴随着旅游业发展与繁荣&#xff0c;更多旅游业发展从业人员越来越重视产品营销品牌基本建设&#xff0c;希望可以将自己的度假旅游产品和服务营销推广给更多的潜在用户。而建立一个优秀的旅游业发展媒体套餐内容品牌是吸引目标客户的重要步骤。下面我们就详…

Harmony鸿蒙南向驱动开发-SPI接口使用

功能简介 SPI指串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 SPI接口定义了操作SPI设备的通用方法集合…

2024比特币减半,Web3的“1995时刻”即将到来

随着比特币减半的到来&#xff0c;加密货币市场迎来了一个关键的转折点。2024年的比特币减半不仅是对比特币供应和挖矿激励的一次重大调整&#xff0c;更是对整个Web3应用领域产生深远影响的事件。 首先&#xff0c;比特币减半的事件本身就为市场带来了一种稀缺性的概念&#…

半透明进口特氟龙材质镊子可耐受强酸强碱腐蚀PFA镊子

PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#xff5e;&#xff0b;260℃&#xff09;、耐腐蚀、表面不粘性等特点&#xff0c;用于苛…

代码随想录算法训练营Day53|LC1143 最长公共子序列LC1035 不相交的线LC53 最大子数组和

一句话总结&#xff1a;秒了。 原题链接&#xff1a;1143 最长公共子序列 与昨天的最长重复子数组极度类似。 由于这里是子序列&#xff0c;两者不相等时有dp[i][j] Math.max(dp[i][j - 1], dp[i - 1][j])。同时由于子序列的缘故&#xff0c;dp数组及下标的含义也有了改变&am…

GPDB技术内幕 - SEMI JOIN浅析

GPDB技术内幕 - SEMI JOIN浅析 SEMI JOIN顾名思义&#xff0c;半连接&#xff0c;相对于join字段来说&#xff0c;针对外表的一行记录&#xff0c;内表只要有一条满足&#xff0c;就输出外表记录。注意&#xff0c;这里是仅输出外表记录。GPDB中有几种实现方式&#xff0c;本文…