力扣系列之-1. 两数之和

24 阅读1分钟

题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

解答

使用Map来实现时间复杂度为n的解法

思路

首先构建一个Map,Key是数组中元素的值,Value是数组中对应元素的下标。然后遍历数组,把数组中元素的值和索引放到Map中。在遍历的时候就可以直接用Map的get方法,用目标值减去当前元素的值得到要找到的值,如果Map里面不为空,就直接返回。

可能遇到的问题

  1. 数组中有重复的元素怎么办? 数组中有重复的元素,那么在put到Map的时候就会更新当前重复元素的索引,对于本题无影响。
  2. 如果最后没找到怎么办? 题目保证了一定会有答案

代码

public int[] twoSum(int[] nums, int target) {
        //check
        if (nums == null) {
            return new int[]{-1,-1};
        }
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int item = nums[i];
            int find = target - item;
            if (map.get(find) != null) {
                return new int[]{map.get(find),i};
            } 
            map.put(item, i);
        }
        return new int[]{-1,-1};
    }

总结与回顾

回顾
用到的数据结构
  1. 数组
  2. Map
用到的思想

遇到需要查找当前值是否存在的时候,一般用Map最快

总结

本题主要用到了Map的put和get方法,和数组的遍历,难度简单,主要是想出来 find = target - item 这个最重要。