leetcode 1.两数之和

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 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.通过建立哈希表,我们可以通过用空间换时间的方法降低时间复杂度

   通过数组的值和下标建立哈希表,遍历数组,若target-nums[i] 的值不存在于哈希表中则将[nums[i],i] 存入哈希表中  

  这样我们只需要遍历一次数组   即时间复杂度为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     }

 

  

posted @ 2018-10-27 09:27  何处长安  阅读(196)  评论(0)    收藏  举报