Two Sum(两个数的相加)

2017.11.10

题目描述:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
解题思路:
1.暴力解法
强行判断nums[i]+nums[j]==target
    /**
    *暴力解法,时间复杂度是O(n^2)
    */
    public int[] twoSum(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
            }          
        } 
        throw new IllegalArgumentException("no such num!");
    }

2.利用hashMap的key-value特性

a.为数组建立索引
b.在索引中查找有没有target-nums[i]的key,并且满足不是数的本身

/**
*利用hashMap的查找元素的时间复杂度为O(1)
*总的时间复杂度是2O(n),即O(n),空间复杂度是O(n)
*/    
public int[] twoSum(int[] nums, int target) {
       Map<Integer,Integer> map= new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],i);
        }
        for(int i=0;i<nums.length;i++){
            int num=target-nums[i];
            //判断map中是否有这个数,并且这个数不是目前这个数
            if(map.containsKey(num)&&map.get(num)!=i){
                return new int[]{i,map.get(num)};
            }
        }

        throw new IllegalArgumentException("no such num!");
    }

3.map中找到就中止

a.先判断map中有没有这个数

b.如果有,则直接返回

    public int[] twoSum(int[] nums, int target) {
       Map<Integer,Integer> map= new HashMap<Integer,Integer>();
       for(int i=0;i<nums.length;i++){
       int num = target-nums[i];
       if(map.containsKey(num)){
           return new int[]{map.get(num),i};
       }
           map.put(nums[i],i);
   }

        throw new IllegalArgumentException("no such num!");
    }

 

posted @ 2017-11-11 00:16  呼呼呼呼呼65  阅读(218)  评论(0编辑  收藏  举报