二分查找(划分时左右元素个数不相等)解析+代码
一:问题描述
当我们在用二分法查找元素的时候,我们往往特希望遇到是奇数个元素个数的数组,因为划分完左右两边的个数相等,所以在以前刚学二分法的时候就有这个疑问,当时就是模模糊糊过去了,再遇到其实还是会有疑问。现在实例验证遇见偶数个数数组元素个数时的二分法
二:思路+示例
目标:查询数组当中是否存在某个数,存在返回其下标,不存在返回-1;
思路:1.这是一个很典型的二分查找的例子,但关键的是我们要考虑其中的符号问题
2.也就是左闭右闭,左闭右开,左开右闭,这是二分法的重点,
3.我们一般使用的是左闭右闭,即[left,right],
举例如:
输入偶数个的数组array[7]: 我们想要查询29是否存在
1 5 9 11 23 29 31 50
1>:我们在选取middle时 middle = 7/2 = 3 取下标为3的元素也就是11,2>:这时划分的数组左右长度不一样,跟我们常规的奇数个的时候不一样,这时我们对左右两边个数的考虑是多余的,因为我们每次都是将middle左边(右边)的所有元素均排除,跟个数完全没有关系,3>:回到上方的例子当中,我们比较29和11的时候直接将左边的所有元素pass掉 下一次比较[middle+1,right]当中的元素,这里左右两边均取闭区间即左闭右闭
三:上码
/**目标:查询数组当中是否存在某个数,存在返回其下标,不存在返回-1;思路:1.这是一个很典型的二分查找的例子,但关键的是我们要考虑其中的符号问题2.也就是左闭右闭,左闭右开,左开右闭,这是二分法的重点,3.我们一般使用的是左闭右闭,即[left,right],举例如:输入偶数个的数组array[7]: 我们想要查询29是否存在 1 5 9 11 23 29 31 50 1>:我们在选取middle时 middle = 7/2 = 3 取下标为3的元素也就是11,2>:这时划分的数组左右长度不一样,跟我们常规的奇数个的时候不一样,这时我们对左右两边个数的考虑是多余的,因为我们每次都是将middle左边(右边)的所有元素均排除,跟个数完全没有关系,3>:回到上方的例子当中,我们比较29和11的时候直接将左边的所有元素pass掉 下一次比较[middle+1,right]当中的元素,这里左右两边均取闭区间即左闭右闭 **/ #include<bits/stdc++.h>
using namespace std;int find(int a[],int size,int target){int left = 0;int right = size - 1;//因为采用的左闭右闭,比如a[5],那么左右边界就是[0,4] int mid;while(left <= right){ //当left == right时候 左闭右闭依然有效mid = left + (right - left)/2;//这里等价于 (right + left)/2if(a[mid] > target){right = mid - 1;}else if (a[mid] < target){left = mid + 1;}else{return mid;}}return -1;//没找到 }int main(){int a[10];int N,target;//N个数和要查询的数 cin >> N >> target;for(int i = 0; i < N; i++){cin >> a[i];} int res = find(a,N,target);cout << res; }
四:补充左闭右开
1:左闭右开[left,right)
即相应的while条件中(left < right) 而当a[mid] > target;时候,对应的 right = mid;
上码:
int search(int nums[], int size, int target)
{int left = 0;int right = size; //定义target在左闭右开的区间里,即[left, right)while (left < right) { //因为left = right的时候,在[left, right)区间上无意义int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle; //target 在左区间,在[left, middle)中 } else if (nums[middle] < target) {left = middle + 1;} else {return middle;}} // 没找到就返回-1return -1;
}
参考自
二分查找(划分时左右元素个数不相等)解析+代码相关推荐
- Day01.二分查找、移除元素
Day01.二分查找.移除元素 0704.二分查找 题目链接:0704.二分查找 思路:二分查找,仅对有序数组有效.每次需要数组的中间值,与目标值比较大小,如果中间值比目标值大,说明目标值位置在lef ...
- 代码随想录Day01:数组理论基础、二分查找、移除元素
目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...
- 代码修炼Day1_LeetCode704二分查找27移除元素
代码修炼Day1_LeetCode704二分查找&27移除元素 一些数组基本知识 数组下标都是从0开始的 数组内存空间的地址是连续的 题目链接: 力扣704二分查找 二分查找思想 针对升序数组 ...
- 代码随想录算法训练营第一天|704二分查找 27移除元素
理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合 2.数组可以方便的通过下标索引的方式获取到下标下对应的数据 3.数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要 ...
- Leetcode 704.二分查找 27.移除元素 代码随想录day1
本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...
- day1 704.二分查找 27.移除元素
文章目录 704.二分查找 思路 代码实现 27.移除元素 思路 代码实现 704.二分查找 题目链接:704.二分查找 思路 使用二分法的前提条件: 1.有序数组 2.无重复元素 代码实现 左闭右闭 ...
- java二分查找算法字符串数组_Java 算法——二分查找数组集合关键元素
packagecom.sinosoft;import java.util.*;importjava.util.stream.Stream;/***@authorCreated by xushuyi * ...
- 【二分查找详解外加递归写法】附有全部代码
二分查找 二分查找:在有序(升序或降序)的集合上,才能使用二分查找. 二分查找的思路: 在一个有序数组中查找一个数 n,我们可以把 n 与 数组的中间元素(mid)不断的去比较, 若 n < ...
- 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!
一:题目 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变 ...
最新文章
- linux开机关机命令
- 职校计算机课堂评课标准,中职学校计算机专业课堂教学评价(共2323字).doc
- Java 10的10个新特性,将彻底改变你写代码的方式
- WPF:WPF显示PDF文档
- 【例题+习题】【数值计算方法复习】【湘潭大学】(三)
- 计算机应用决策支持系统,计算机决策支持系统技术及应用研究
- 进程间通信---共享内存 ftok shmat shmget shmdt shmctl
- Python 类的特殊成员介绍
- STM32F207和DM9161A的以太网实现方案
- 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
- 干货,分享!后台模板hplus 好看的后台纯模板!!!
- 计算机考试考什么二级,计算机国家二级考试会考什么内容?怎么考?
- Bootstrap 可视化编辑器summernote
- 数据结构--链表概念及常见链表结构
- 2021-2027全球与中国自动卡车卸货系统 (ATLS)市场现状及未来发展趋势
- 【达摩院OpenVI】AIGC技术在图像超分上的创新应用
- 南京信息工程大学 2021年 考研 软件工程 复试经验分享
- 打车应用生死未卜 嘀嘀或傍上腾讯
- 嵌入式Linux 的Cramfs 根文件系统配置成可读可写
- matlab汽车稳态响应特性仿真,基于MATLAB的车辆工程仿真实例
热门文章
- matlab randn 范围,请问randn产生的数据在什么范围内变化
- 20分钟完成Mac上的 LNMP 环境部署,优雅·高效开发(Docker方式)
- 保姆级C语言版高斯坐标正算反算倾情奉献!
- 测绘地理信息标准(国家、行业、地方)大全来了:测绘地理信息标准化服务平台
- Android之URL “page={page}category_id={***} string For dynamic query parameters use @Query.
- Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信
- LeetCode之Hamming Distance
- 【C语言简单说】十三:逻辑运算符||
- vscode搜索文件_VS Code 新图标来临 —— 侧边栏、文件管理器、搜索、调试等区域的图标迎来全新设计...
- 美女的床真的好难爬......