1.两数之和


题目要求:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路一:暴力抓取
依次取一个数m,寻找剩下的数组中是否存在target-m,存在则找到。

public static int[] twosum(int[] nums, int target){
        int array[]=new int[2];
        for(int i=0;i<nums.length;i++){
           for(int j=i+1;j<nums.length;j++){
               if((target-nums[i])==nums[j]) {
                   array[0] = i;
                   array[1] = j;
                   return array;
               }
           }
        }
        return null;

这样的话时间复杂度为O(n^2),空间复杂度为O(1)。

思路二:Hash映射
思路一的方法时间复杂度肯定不合格,我们就应该要考虑如何降低啦。很容易想到那就是我们在寻找target-m的时候不去遍历数组,而是采用将数组放到散列表/哈希数组中去,直接查看是否存在即可。

int array[]=new int[2];
        HashMap<Integer,Integer> m=new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            m.put(nums[i], i);
        }
        for(int i=0;i<m.size();i++){
            //这里注意不仅要判断HashMap中是否存在target-nums[i],还要防止出现同一元素出现两次,比如                      [3,2,4],target=6,返回结果就会变成array[0,0]。
            if(m.containsKey(target-nums[i])&&(i!=m.get(target-nums[i]))){
                array[0]=i;
                array[1]=m.get(target-nums[i]);
                return array;
            }
        }
        return null;

这种情况下,以空间换时间,我们的时间复杂度就变为O(n),空间复杂度也为O(n)。