(java)哈希表 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
2019-01-17 00:10
531 查看
原题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
最容易想到的就是两个循环暴力破解,不过时间复杂度太高了:O(n^2),最近也是在网上刷题,想多了解点其他求解方法来减少复杂度。
大致思路:在数据结构中有一种表叫哈希表,可以通过自己定义一种映射,将原本数组中对应的下标和值,一一映射到哈希表中。在数组中我们通过下标来找值value,但还是要通过比较才能得出是不是我们想要的值value;而在哈希表中,我们的键值(key)即是我们的value。进一步来说就是将值存放在哈希表中就代表我们已经知道了原来的数组有哪些值,即可以很方便的获取到。
涉及函数:
map.put(nums[i],i);//将数组值和对应的下标存放于哈希表中。(这里没有过多的考虑哈希冲突,可能会有元素相同的情况,之后有时间再讨论)
map.containsKey(temp);//判断哈希表是否含有元素temp,有则返回true,否则返回false。
map.get(temp);//获取在哈希表中键值为temp对应的值,即原来数组中值对应的下标。
具体算法如下:
package sicnu.sty; import java.util.HashMap; import java.util.Map; public class LT_HashMap { public static void main(String[] args) { // TODO Auto-generated method stub int nums[]={2,54,7,15}; int target = 9; Map<Integer,Integer> map = new HashMap<>();//定义一个存放整数的哈希表 for(int i=0;i<nums.length;i++){ map.put(nums[i],i);//将数组值和对应的下标存放于哈希表中。 } for(int i=0;i<nums.length;i++){ int temp = target-nums[i]; if(map.containsKey(temp)&&map.get(temp)!=i){//判断是否包含temp并且不能为本身 // int a[]={i,map.get(temp)}; System.out.println(i+""+map.get(temp)); return ; } } } }
附上截图:
最终输出2和7的坐标0和2,时间复杂度为 O(n)。
有不对的地方或者改进还请留言讨论,谢谢。
相关文章推荐
- (python)给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数。
- java每日一题:给定一个整数数组arr和整数target,返回两个索引值,使得这两个索引值对应的整数的和等于target。(arr中有且仅有一组)
- leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组
- 给定一个整数数组,找出两个下标,要求后面下标所指的数减去前面下标所指的数之差最大
- 给定一个整数数组,返回数组中两个元素的和为target的索引
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数,请在这个特殊数组中找出给定的整数
- 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 给定一个n个整数的数组S,是否存在S中的4个数,使得a + b + c + d = target。 在数组中找出所有唯一的四元组,给出目标的总和。
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1中,使得 num1 成为一个有序数组。 注意: 你可以假设 nums1有足够的空间(空间大小大于或等于m + n
- 算法3:找出一个整数数组里面两个查值最大的两个下标a[j]-a[i]最大并且i<j
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。