https://leetcode-cn.com/problems/two-sum/
解题思路
S1: 暴力枚举 O(n2)
思路及算法:依次遍历数组中每一个数x,寻找数组中是否存在 target - x。
注意:避免元素重复比较,所以我们只需要在 x 后面的元素中寻找 target - x。
class Solution {// 思路:1.按顺序比较两数之和,命中则返回下标// 2.注意两数相加越界场景,解决方案:用目标数 - 其中一个数public int[] twoSum(int[] nums, int target) {int n = nums.length;for (int i = 0; i < n; i++) {// int j=i+1,仅比较i后面的元素for (int j = i + 1; j < n; j++) {if (nums[i] + nums[j] == target) {return new int[]{i, j};}}}return new int[0];}}
S2: 哈希表-空间换时间 O(n)
我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
思路及算法:这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中(key=x=nums[i] , value=i ), 即可保证不会让 x 和自己匹配。
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();for (int i = 0; i < nums.length; ++i) {// 缓存已遍历的数值和下标,便于后续元素快速比较匹配if (hashtable.containsKey(target - nums[i])) {return new int[]{hashtable.get(target - nums[i]), i};}hashtable.put(nums[i], i);}return new int[0];}}
