1. 两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例

给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

我的方案

利用两层循环,暴力查找。

Java源码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        if(nums == null || nums.length<2) return null;
        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};
            }
        }
        return new int[]{};
        
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

Dart源码

class Solution {
    List<int> twoSum(List<int> nums, int target) {
        if (nums == null || nums.length < 2) return [];
        for (int i = 0; i < nums.length; i++) {
            for (var j = i + 1; i < nums.length; i++) {
                if(target == nums[i] + nums[j]){
                    return [i,j];
                }
            }
        }
        return [];
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

复杂度分析

  • 时间复杂度:O(n²)

两层循环

  • 空间复杂度: O(1)

官方方案

利用 HashMap 作为存储,键为目标值减去当前元素值,索引为值,比如 i = 0 时,此时首先要判断 nums[0] = 2 是否在 map 中,如果不存在,那么插入键值对 key = 9 - 2 = 7, value = 0,之后当 i = 1 时,此时判断 nums[1] = 7 已存在于 map 中,那么取出该 value = 0 作为第一个返回值,当前 i 作为第二个返回值,具体代码如下所示。

Java源码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        if(nums == null || nums.length<2) return new int[]{};    
        Map<Integer,Integer> map = new HashMap<>();  
        for(int i = 0;i<nums.length;i++){
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        return new int[]{};
        
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Dart源码

List<int> twoSum(List<int> nums, int target) {
  if (nums == null || nums.length < 2) return [];
  Map<int, int> map = {};
  for (int i = 0; i < nums.length; i++) {
    int complement = target - nums[i];
    if (map.containsKey(complement)) {
      return [map[complement], i];
    }
    map[nums[i]] = i;
  }
  return [];
}

1
2
3
4
5
6
7
8
9
10
11
12
13

复杂度分析

  • 时间复杂度:O(n)

我们只遍历了包含有 n 个元素的列表一次。哈希表将查找时间缩短到 O(1)O(1),所以时间复杂度为O(n)。

  • 空间复杂度:O(n)

所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。

最后更新时间: 10/16/2019, 11:13:08 PM