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!"); }