题目:数组
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。spa
你能够假设每一个输入只对应一种答案,且一样的元素不能被重复利用。code
示例:blog
给定 nums = [2, 7, 11, 15], target = 9 由于 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
思路分析:
1.最容易想到的应该是暴力解法, 经过遍历整个数组每一个数,再次遍历数组,从中找target-nums[i]的数。 时间复杂度为O(n^2) 效率十分低下
1 public int[] twoSum(int[] nums, int target) { 2 for(int i=0;i<nums.length-1;i++){ 3 int temp=target-nums[i]; 4 for(int j=i+1;j<nums.length;j++){ 5 if(nums[j]==temp){ 6 return new int[]{i,j}; 7 } 8 } 9 } 10 return new int[] {}; 11 }
2.经过创建哈希表,咱们能够经过用空间换时间的方法下降时间复杂度get
经过数组的值和下标创建哈希表,遍历数组,若target-nums[i] 的值不存在于哈希表中则将[nums[i],i] 存入哈希表中 class
这样咱们只须要遍历一次数组 即时间复杂度为O(n)效率
1 public int[] twoSum(int[] nums, int target) { 2 Map<Integer,Integer> map=new HashMap(); 3 for(int i=0;i<nums.length;i++){ 4 int temp=target-nums[i]; 5 if(map.get(temp)!=null){ 6 return new int[]{map.get(temp),i}; 7 } 8 else{ 9 map.put(nums[i],i); 10 } 11 } 12 return new int[]{}; 13 }