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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题目原地址:

https://leetcode-cn.com/explo...

可以把写好的代码去这里提交,验证是否通过。

/**
 * 首先想到的肯定是拿第一个元素与后面的依次加,看是否等于目标值,
 * 然后再第二个、第三个...
 */
public int[] twoSum1(int[] nums, int target) {
    for (int i = 0; i < nums.length - 1; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) {
                return new int[] {i, j};
            }
        }
    }
    return new int[]{0,0};
}

/**
 * 把数值作为 key,它的下标作为 value
 * 遍历数组,判断 map 是否含有这个目标值-当前数值,
 * 有直接返回,没有的话放到map里面
 *
 * 所以以后写代码,如果有双层 for 循环,首先考虑一下能否用 map 替换一层
 */
public int[] twoSum2(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        if (map.containsKey(target - nums[i])) {
            return new int[]{map.get(target - nums[i]),i};
        }
        map.put(nums[i], i);
    }
    return new int[]{0,0};
}

这个好像有点简单


志哥
443 声望175 粉丝