01.两数之和

77 阅读1分钟

01.两数之和

暴力解法: O( N 2 N^2 N2)两层for循环遍历所有可能.

收获: 学会如何返回数组.

static int[] twoSum(int[] nums, int target) {
    for(int i = 0 ;i<nums.length ;i++){
      for(int j = 0 ; j < nums.length ; j++){
        if( i == j)
          continue;
        if(nums[i]+ nums[j] == target){
          return new int[] {i,j};//返回数组
        }
      }
    }
    return null;
}

HashMap:O( N N N)采用HashMap可以将时间复杂度降一个级别,原因在于HashMap查询元素的时间复杂度为O(1),其实暴力解法一的第二层for循环可以看作查询能使 nums[i]+ nums[j] == target 的nums[j],只不过查询的复杂度为O( N N N).

收获: 学会使用HashMap,善用HashMap查询时间复杂度为O(1)

补充: HashMap底层原理链地址法解决哈希冲突)

static int[] twoSum2(int[] nums,int target){
    Map<Integer,Integer> map = new HashMap<>();
    for(int i = 0 ; i < nums.length ; i++){
        int n = target - nums[i];
        if(map.containsKey(n)){ //containsKey(n):是否包含键值 n
          //get(n):得到键值为n的value值,本题中就是数组下标
          return new int[] {map.get(n),i}; 
        }
        map.put(nums[i],i);
    }
    throw new IllegalArgumentException("No two sum solution");
}