【数据结构与算法】二分:如何判断某个元素是否存在一个有序的数组中?

总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

count = 0;

while (low <= high) {

int mid = (low + high) / 2;

count++;

if (a[mid] == value) {

return mid;

} else if (a[mid] < value) {

low = mid + 1;

} else {

high = mid - 1;

}

}

return -1;

}

3.定义一个成员变量:count(记录查询了多少次)

/**

  • 一共搜索了多少次

*/

public static int count = 0;

4.main函数

public static void main(String[] args) {

int[] data = initData(500);

Scanner scanner = new Scanner(System.in);

while (true){

System.out.println(“请输入要查询的数字:”);

int num = scanner.nextInt();

if(num == -1){

System.exit(0);

}

int bsearch = bsearch(data, data.length, num);

System.out.println(“搜索结果所在的下标:”+bsearch+“,搜索了”+count+" 次");

}

}

5.运行

我随机输了5个数字,请看结果:

从结果来看,最多9次就能得出结果 ,是不是比循环整个数组快得多?这里面的逻辑其实也很简单,每次和取中的数据对比,然后得出下一个取中数据,继续对比,直到找到数据或者取完还找不到数据返回-1。

如何找到数据在数组中第一次出现的位置?


之前说过了通过二分法可以快速的找到某个元素,但是怎么做到找到这个元素第一次出现的位置呢?如数组a:{1,2,3,3,3,5,6};假设我们要查找元素3第一次出现的位置。该如何实现?还能继续使用二分查找吗?

我们分析一下,第一步使用3与数组中的a[3]对比,发现正好相等,直接返回了a[3]的下标(2),但这是元素3第一次出现的位置吗?我们看数组a,第一次出现3的位置在下标:2,所以很明显,通过二分查找的下标并不是我最终想得到的结果,那是不是意味着二分查找无法满足了呢?

其实我们还是可以通过二分来实现此功能,只需要在二分的基础上做一点点小改动就可以了,如何改动呢?我们想象一下,当我们使用3与数组中的a[3]对比的时候发现他们相等的同时判断一下上一个元素是否也和他相等(a[2]),如果相等就继续二分,否则返回当前下标,这样是不是就能找到某个元素第一次出现的位置了呢?

下面我们使用代码实现一下上面的需求

main函数:

public static void main(String[] args) {

int[] data = {1,2,3,3,3,5,6};

Scanner scanner = new Scanner(System.in);

while (true){

System.out.println(“请输入要查询的数字:”);

int num = scanner.nextInt();

if(num == -1){

System.exit(0);

}

int bsearch = bsearch(data, data.length, num);

System.out.println(“第一次出现的下标:”+bsearch+“,搜索了”+count+" 次");

}

}

二分查找:

/**

*使用二分查找数据

  • @param a 数组内容

  • @param n 数组长度

  • @param value 要查询的数字

  • @return

*/

private static int bsearch(int[] a, int n, int value) {

int low = 0;

int high = n - 1;

count = 0;

while (low <= high) {

count++;

int mid = low + ((high - low) >> 1);

if (a[mid] > value) {

high = mid - 1;

} else if (a[mid] < value) {

low = mid + 1;

} else {

if ((mid == n - 1) || (a[mid - 1] != value)) return mid;

else low = mid + 1;

}

}

return -1;

}

仔细看,你会发现这与之前的代码并没有什么差别,唯一一点变化在于判断的时候多了一个条件:a[mid-1] != value,这样就能实现找到某个元素在数组中第一次出现的位置,查找结果如下:

是不是很简单?那我们再来看几种情况。

查找最后一个值等于给定值的元素


相信大家都知道怎么做了吧,和找到第一次出现的位置一样,加一个判断条件:当我们使用3与数组中的a[3]对比的时候发现他们相等的同时判断一下下一个元素是否也和他相等(a[4]),如果相等就继续二分,否则返回当前下标。

/**

*使用二分查找数据

  • @param a 数组内容

  • @param n 数组长度

  • @param value 要查询的数字

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值