算法题: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;    }}



原创粉丝点击