一:问题描述

当我们在用二分法查找元素的时候,我们往往特希望遇到是奇数个元素个数的数组,因为划分完左右两边的个数相等,所以在以前刚学二分法的时候就有这个疑问,当时就是模模糊糊过去了,再遇到其实还是会有疑问。现在实例验证遇见偶数个数数组元素个数时的二分法

二:思路+示例

目标:查询数组当中是否存在某个数,存在返回其下标,不存在返回-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;
}

参考自

二分查找(划分时左右元素个数不相等)解析+代码相关推荐

  1. Day01.二分查找、移除元素

    Day01.二分查找.移除元素 0704.二分查找 题目链接:0704.二分查找 思路:二分查找,仅对有序数组有效.每次需要数组的中间值,与目标值比较大小,如果中间值比目标值大,说明目标值位置在lef ...

  2. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  3. 代码修炼Day1_LeetCode704二分查找27移除元素

    代码修炼Day1_LeetCode704二分查找&27移除元素 一些数组基本知识 数组下标都是从0开始的 数组内存空间的地址是连续的 题目链接: 力扣704二分查找 二分查找思想 针对升序数组 ...

  4. 代码随想录算法训练营第一天|704二分查找 27移除元素

    理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合 2.数组可以方便的通过下标索引的方式获取到下标下对应的数据 3.数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要 ...

  5. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

  6. day1 704.二分查找 27.移除元素

    文章目录 704.二分查找 思路 代码实现 27.移除元素 思路 代码实现 704.二分查找 题目链接:704.二分查找 思路 使用二分法的前提条件: 1.有序数组 2.无重复元素 代码实现 左闭右闭 ...

  7. java二分查找算法字符串数组_Java 算法——二分查找数组集合关键元素

    packagecom.sinosoft;import java.util.*;importjava.util.stream.Stream;/***@authorCreated by xushuyi * ...

  8. 【二分查找详解外加递归写法】附有全部代码

    二分查找 二分查找:在有序(升序或降序)的集合上,才能使用二分查找. 二分查找的思路: 在一个有序数组中查找一个数 n,我们可以把 n 与 数组的中间元素(mid)不断的去比较, ​ 若 n < ...

  9. 33. 搜索旋转排序数组(013)二分查找+思路详解+来干了这杯代码!!!!!!

    一:题目 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变 ...

最新文章

  1. linux开机关机命令
  2. 职校计算机课堂评课标准,中职学校计算机专业课堂教学评价(共2323字).doc
  3. Java 10的10个新特性,将彻底改变你写代码的方式
  4. WPF:WPF显示PDF文档
  5. 【例题+习题】【数值计算方法复习】【湘潭大学】(三)
  6. 计算机应用决策支持系统,计算机决策支持系统技术及应用研究
  7. 进程间通信---共享内存 ftok shmat shmget shmdt shmctl
  8. Python 类的特殊成员介绍
  9. STM32F207和DM9161A的以太网实现方案
  10. 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
  11. 干货,分享!后台模板hplus 好看的后台纯模板!!!
  12. 计算机考试考什么二级,计算机国家二级考试会考什么内容?怎么考?
  13. Bootstrap 可视化编辑器summernote
  14. 数据结构--链表概念及常见链表结构
  15. 2021-2027全球与中国自动卡车卸货系统 (ATLS)市场现状及未来发展趋势
  16. 【达摩院OpenVI】AIGC技术在图像超分上的创新应用
  17. 南京信息工程大学 2021年 考研 软件工程 复试经验分享
  18. 打车应用生死未卜 嘀嘀或傍上腾讯
  19. 嵌入式Linux 的Cramfs 根文件系统配置成可读可写
  20. matlab汽车稳态响应特性仿真,基于MATLAB的车辆工程仿真实例

热门文章

  1. matlab randn 范围,请问randn产生的数据在什么范围内变化
  2. 20分钟完成Mac上的 LNMP 环境部署,优雅·高效开发(Docker方式)
  3. 保姆级C语言版高斯坐标正算反算倾情奉献!
  4. 测绘地理信息标准(国家、行业、地方)大全来了:测绘地理信息标准化服务平台
  5. Android之URL “page={page}category_id={***} string For dynamic query parameters use @Query.
  6. Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信
  7. LeetCode之Hamming Distance
  8. 【C语言简单说】十三:逻辑运算符||
  9. vscode搜索文件_VS Code 新图标来临 —— 侧边栏、文件管理器、搜索、调试等区域的图标迎来全新设计...
  10. 美女的床真的好难爬......