1.两数之和
2018-03-30 本文已影响7人
第四单元
题目
给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路
思路一:在leetcode上这道题用两重循环也能AC,但有没有更优的方案呢?
思路二:对于A+B=C,B = C - A。我们先确定A,再从数组中找B。而常用的查找方法
有二分查找、Hash等。这个题不适用二分查找,因为二分查找需要先排序,而本题要求
返回两个下标,排序后下标就乱了,否则需要专门想其他办法来维护原下标,不划算。
那么考虑HashMap。key为元素的值,value为下标。把数组元素依次put进map,每次计算
diff = target - nums[i],在map中查找diff,查找到则结束,否则把nums[i] i加入map。
代码
import java.util.Scanner;
import java.util.Arrays;
import java.util.HashMap;
public class Solution {
public int[] twoSum(int[] nums,int target) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
if(map.containsKey(diff)) {
return new int[] {map.get(diff),i};
} else {
map.put(nums[i],i);
}
}
return null;
}
//测试
public static void main(String[] args) {
Solution solution = new Solution();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int target = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++)
arr[i] = scanner.nextInt();
// System.out.println(solution.binarySearch(arr,11));
System.out.println(Arrays.toString(solution.twoSum(arr,target)));
}