今天去某在线教育面试面试官让做的一道题,题目描述如下:
-
<李>给定一个不重复的无序数arr组和一个定值num李>
<李>查找加勒比海盗中是否有两个数的和等于num李>
<李>有则返回这两个数的下标(可能有多组,只用返回一组),没有则返回零李>
很多人一想可能就是两层的循环,我想了很久最后写了双重的循环…【这个代码太容易就不放了,然后面试官说知道哈希吗,由于哈希查找的时间复杂度是O(1),从哈希的角度去考虑,这中间还有一堆就不描述了,说一下怎么用哈希实现。
<>强实现思路:强>
将数组中的所有的值放入HashMap的关键中,价值存放该值对应的下标,遍历这个HashMap,取得关键,计算如果可以和这个键加起来的和为num的值,如果这个值存在,就直接返回这两个下标。遍历一次的时间复杂度为O (N),查找的时间复杂度是O(1),总体时间复杂度O (N)。
<强>代码实现:强>
公开课getTwoNumsSumEquals { 公共静态void main (String [] args) { arr int []=new int [] {3、4、6、5、9 - 8}; int num=8; int [] ret=getIndex (arr num); 系统。println(“两个数指数R:“+ ret [0] + " " + ret [1]); }//找到这两个数的下标并返回(以长度为2的数组的形式返回) 私有静态int [] getIndex (int[]加勒比海盗,int num) { int [] ret=new int [2]; Integer> HashMap<整数;,hashMap=new HashMap<的在(); int指数=0;//将每个数字和其下标放进地图中 (整数咕咕叫:arr) { hashMap。把(咕咕叫,指数+ +); }//遍历HashMap并判断 (Map.Entry<整数,Integer>条目:hashMap.entrySet ()) { int value=https://www.yisu.com/zixun/entry.getKey (); int subValue=num -价值; 如果(hashMap.containsKey (subValue)) {//找到啦! ret [0]=entry.getValue (); ret [1]=hashMap.get (subValue); 打破; } } 返回受潮湿腐烂; } }
<强>总结强>
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接