一. 英文原题
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].
二. 中文翻译
给定一组整数数组,返回两个元素的下标,这两个元素相加后是一个特定的结果。您可以假设每次输入都有一个解决方案,但是同一个元素不允许使用两次。
三. 个人理解
就是给你一个整数数组,然后再给你一个整数,找出这个数组的哪两个数相加可以等于这个整数,然后返回这两个数的下标
四. 遇到的问题
-
不知道该如何return[1,2]的格式
-
错误的以为键值对,必须是相互对应,其实可以相互转换
-
最初使用的是最笨的方法,,相当于暴力做法,暴力的做法很简单,嵌套两个for循环,循环遍历每个元素
五. 解题思路
1.Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复,value的值可以相同,所以通过指定的key就可以取出对应的value
-
使用map
-
Map<K,V>
-
boolean containsKey(Object key) : 是否包含指定的Key
-
boolean containsValue(Object value) : 是否包含指定的Value
-
V get(Object key) 根据指定的key获取Value
-
V put(K key, V value) : 添加一个键值对到Map
2.因为题目让求的是下标,但是map里的get方法是通键返回值 ,所以得把下标设成值,才能返回.如果把下标作为键 ,map却里没有通过值返回键的方法(因为map允许多个不同的键对应一个相同的对,所以map里不提供通过值返回键的方法),所以这道题应该把下标设置为值
3.map不需要赋值也可以调用方法
具体介绍: 点我查看
六. 优质答案
方法一: public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement) && map.get(complement) != i) { return new int[] { i, map.get(complement) }; //get是根据获取值,如果上面是put(i,nums[i]的话这里就是根据下标,而且使用containskey更耗时) } } throw new IllegalArgumentException("No two sum solution"); }
方法二 public class Solution { public int[] twoSum(int[] nums, int target) { 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); } throw new IllegalArgumentException("No two sum solution"); } }
七. 参考资料
无
请登录之后再进行评论