当前位置:网站首页>【21天学习挑战赛】折半查找
【21天学习挑战赛】折半查找
2022-08-10 15:25:00 【Alex抱着爆米花】
活动地址:CSDN21天学习挑战赛
怕什么真理无穷,进一步有一份的欢喜。
【21天学习挑战赛】折半查找
我为什么参与挑战赛
1,机缘
读到研一了,暑假假期打开私信发现这个挑战赛就鼓起勇气参加了。
2,期待的收获
A, 本人在华南理工大学攻读专硕,目前研究方向是图像恢复,从事深度学习相关工作,目标是从事Java后端开发。
B, 期待您的反馈,如果有什么不对的地方,欢迎指正!
C, 期待认识志同道合的领域同行或技术交流。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
什么是折半查找?
折半查找的又称为二分查找,是一种效率相对较高的查找方法。使用该算法的前提要求是元素已经有序,如同名字一样,每次都是根据区间中心将元素分为左右半边,通过比较区间中心和要查找的元素的值,确定下次要查左半边还是右半边。

折半查找的优劣
优势
时间复杂度为O(log2n),查找的速度较快,并且比较简单实现,通过判断来不断更新区间的左右端点值。
劣势
要求元素已经有序,这在大多数情况下不存在,且插入删除困难。
折半查找的步骤
不断的重复取中间比较和指定新的搜索区间这两个步骤,直到区间左右端点重合(代表搜素结束)或者找到元素为止。
- 与key相同:直接返回对应的位置
- 与key大:由于元素有序,要查找的元素一定在左侧(如有),于是搜素区间变为左一半
- 与key小:由于元素有序,要查找的元素一定在右侧(如有),于是搜素区间变为右一半
️ 算法实现
public class BinarySearch {
public static void main(String[] args) {
// input data
int[] a = {
10, 11, 12, 14, 20, 32, 34, 35, 41, 43};
int key = 11;
// 调用算法,并输出结果
int result = search(a, key);
System.out.println(result);
}
private static int search(int[] nums, int target) {
// 初始化变量
int left = 0, right = nums.length - 1, mid = 0;
// 循环终止条件为:左右端点发生交错
while (left <= right) {
mid = (left + right) >> 1;//除以2
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
// 循环结束还未触发内部的return则代表未找到,此时返回-1
return -1;
}
}
相关题目
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
作者:力扣 (LeetCode)
链接:https://leetcode.cn/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
答案
使用折半查找
class Solution {
public int searchInsert(int[] nums, int target) {
// 折半查找
int left = 0, right = nums.length - 1, mid = 0;
while (left <= right) {
// 防止 left+right 整型溢出
mid = (left + right) >> 1;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
return left;
}
}
如果觉得对你有帮助的话:
点赞,你的认可是我创作的动力!
️ 收藏,你的青睐是我努力的方向!
️ 评论,你的意见是我进步的财富!
边栏推荐
- JS entry to proficient full version
- FFmpeg 交叉编译
- pm2 static file service
- Basic learning of XML
- 匿名函数和全部内置函数详细认识(下篇)
- Network engineer's backpack (EDC summary recommendation)
- [Data warehouse design] Why should enterprise data warehouses be layered?(six benefits)
- 5G NR MIB详解
- 颜色空间
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
猜你喜欢
![[Semantic Segmentation] DeepLab Series](/img/3d/f06c04522db40ad17f7f725613a035.png)
[Semantic Segmentation] DeepLab Series

产品说明丨如何使用MobPush快速创建应用

Cesium快速上手4-Polylines图元使用讲解

一个 ABAP Development Tool 自定义 service endpoint 的测试工具

E-commerce spike project harvest (2)

FP6378AS5CTR SOT - 23-5 effective 1 mhz2a synchronous buck regulator

Rich Dad Poor Dad Reading Notes

Cesium Quick Start 4-Polylines primitive usage explanation

Mysql statement analysis, storage engine, index optimization, etc.

NFT数字藏品——数字藏品发行平台开发
随机推荐
十年架构五年生活-09 五年之约如期而至
TCP为什么是三次握手和四次挥手?
Programmer = overtime??- Master the time to master the life
Based on Azuki Series: NFT Valuation Analysis Framework "DRIC"
常见SQL、API接口等常见约定
A Sina Weibo semantic sentiment analysis tool developed by ABAP
Redis -- Nosql
E-commerce spike project harvest (2)
数据类型与整型存储
“蔚来杯“2022牛客暑期多校训练营7
Chapter one module of the re module,
QOS功能介绍
Yi Gene|In-depth review: epigenetic regulation of m6A RNA methylation in brain development and disease
【吴恩达来信】强化学习的发展!
易观千帆银行用户体验中心:聚焦银行APP用户体验
12海里、24海里、200海里的意义及名称
虚拟电厂可视化大屏,深挖痛点精准减碳
Opencv 图像超像素分割(SLIC、SEEDS、LSC)
一文让你快速了解大小端概念!
[Semantic Segmentation] DeepLab Series