619 字
3 分钟
LeetCode热题100-01
01-两数之和
又回到梦开始的地方。
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入: nums = [3,2,4], target = 6
输出: [1,2]
示例 3:
输入: nums = [3,3], target = 6
输出: [0,1]
提示:
2 <= nums.length <= 10⁴-10⁹ <= nums[i] <= 10⁹-10⁹ <= target <= 10⁹- 只会存在一个有效答案
思考
首先,看完题目后,根据nums的长度最大为10⁴可以知道,这道题目直接暴力两个for循环判断也是不会超时的。 所以最简单的方法就是暴力两个for直接解决
public static int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length - 1; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[i] + nums[j] == target) { return new int[]{i, j}; } } } return null;}但是这种方式速度实在太慢了。 接着我想到,内部的for循环其实是在找数组里有没有符合要求的数,那我如果使用一个哈希表,将前面出现过的数的下标存到哈希表中,然后key使用匹配的数(因为是两数之和,所以只有唯一一个匹配的数),也就是
假如是 nums = [2,7,11,15], target = 9 那么就会是下面这样的流程:
- 从哈希表中找一下是否存在2需要匹配的数 也就是9-2=7 (目前哈希表为空)
- 匹配不到 则将 key: 7 (9-2=7) 和value: 0 (2的下标) 存储到哈希表中 (目前哈希表[7-2])
- 继续遍历下一位,数字7,同样的从哈希表中查找是否存在2 通过map.get(7) 可以得到值 说明存在 且得到的值0就是对应的下标
- 于是返回 得到的下标 0 和当前的下标 1 返回[0,1]
于是我改成了下面这样的代码:
HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) { if(map.containsKey(nums[i])){ return new int[]{map.get(nums[i]),i}; } map.put(target-nums[i],i);}return null;总结
毕竟是简单难度的题目,还是相当轻松就能想到思路的。
LeetCode热题100-01
http://www.shineacz.top/posts/leetcode热题100-01/