算法题:lintcode#56 两数之和(java)
来源:互联网 发布:mac最下面的图标移上去 编辑:程序博客网 时间:2024/06/05 17:41
原题:
给一个整数数组,找到两个数使得他们的和等于一个给定的数target
需要实现的函数需要返回这两个数的下标,并且第一个下标小于第二个下标(下标的范围是1到n,不是以0开头)
样例:
给出numbers=[2, 7, 11, 15],target=9, 返回[1, 2]
方法一:
思路:
1. 利用双层循环历遍数组,找出符合条件的数
2. 将其下标+1后(因为数组下标从0开始)按顺序存入新建数组中,将数组返回
public class Solution { public int[] twoSum(int[]numbers,int target){ int sum[]=new int[2]; for(int i=0;i<numbers.length;i++){ for(int j=i+1;j<numbers.length;j++){ if(target-numbers[i]==numbers[j]){ sum[0]=i+1; sum[1]=j+1; } } } return sum; }}
方法二:
思路:
1. 存入对应的下标:
(1)用一个键值对的集合HashMap,以数组中元素与target差值为key,对应数组元素的下标作为value并用HashSet来存储
(2)用for循环历遍数组,对求出的差值做判断:
A. HashMap中若有对应值的key,则将当前数组元素的下标存入HashMap中(因为考虑到数组元素值重复的问题,所以会下标不同,但是求出的差值相同)
B. 若无,则创建集合HashSet并存入当前数组元素的下标,然后将差值与HashSet分别作为key与value存入HashMap中
(3)这样,若数组中有元素a与HashMap的key相等,就能满足数组中两数之和为target的值,此时a的下标与对应key的value就是所求
2. 取出需要的下标:
(1)创建一个新数组来保存要返回的下标
(2)在for循环中,若当前数组元素与HashMap中的一个key相等:
A. 用get方法返回此key的value的集合,并用迭代器依次取出这个key的value(也就是下标)赋值给index(第一次调用iterator的next()方法时,会返回集合中的第一个元素)
B. 然后两个下标做比较,因为数组下标的唯一性,所以避免返回是的是同一个数组元素的下标。
比如:target为8, 数组中元素与target的差值为4, 也就是8 - 4 = 4; 若两个数组元素值为4, 那么对应的两个下标都会被存入以4为key的HashMapt中,并且不能保证先后顺序,所以iterator可能会取出for循环中当前数组元素的下标,也就需要做判断
C. 根据题目要求,对符合条件的下标进行排序与增值,存入数组
(3)返回数组
public class Solution { public int[] twoSum(int[]numbers,int target){ HashMap<Integer,HashSet<Integer>> numToIndexes=new HashMap<Integer, HashSet<Integer>>(); for(int i=0;i<numbers.length;i++){ int diff=target-numbers[i]; if(numToIndexes.containsKey(diff)) numToIndexes.get(diff).add(i); else{ HashSet<Integer> set=new HashSet<Integer>(); set.add(i); numToIndexes.put(diff,set); } } int[] ans=new int[2]; for(int i=0;i<numbers.length;i++){ if(numToIndexes.containsKey(numbers[i])){ int index=numToIndexes.get(numbers[i]).iterator().next(); if(index!=i){ ans[0]=Math.min(i,index)+1; ans[1]=Math.max(i,index)+1; break; } } } return ans; }}
- 算法题:lintcode#56 两数之和(java)
- LintCode 第56题 两数之和 【排序算法】
- LintCode(56) 两数之和
- lintcode-两数之和-56
- lintcode,56,两数之和
- LintCode 56- 两数之和
- LintCode 56 两数之和
- lintcode 56 两数之和
- [Lintcode] #56 两数之和
- 两数之和(LintCode)
- Lintcode 两数之和
- LintCode 两数之和
- LintCode-两数之和
- LintCode 两数之和
- lintcode--两数之和
- lintcode 两数之和
- LintCode-两数之和
- LintCode 两数之和
- EasyPermission Android 6.0 最简洁的权限框架
- EDA To Prediction(DieTanic)
- Linux 交换内存处理 CDH 交换内存报错
- 这可能是最好的RxJava 2.x 入门教程(二)
- 解决伪分布式hadoop部署hive后,无法通过beeline连接
- 算法题:lintcode#56 两数之和(java)
- 6.3
- Java对象的访问定位
- folium遇到的坑 不显示颜色
- 6.17
- HUD 1008 Elevator
- thinkPHP5-toArray()方法
- Android连接WiFi再探索
- 文件尾条件