题1:给定一个数组和一个目标和,从数组中找两个数字相加等于目标和,输出这两个数字的下标。
Given nums = [2,7,11,15],target =9,
Because nums[0] +nums[1] = 2+7 = 9,
return [0,1]
1 package test;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 public class TestController01 {
9 /**
10 *
11 */
12 public static void main(String[] args) {
13 int[] nums = {2,7,11,15,1,8};
14 int target = 9;
15 // int[] twoSum = twoSum1(nums,target);
16 // int[] twoSum = twoSum2(nums,target);
17 List<Integer> twoSum = twoSum3(nums,target);
18 for (int i : twoSum) {
19 System.out.println(i);
20 }
21 }
22
23 /**
24 * 方法1:两层循环
25 * @param nums
26 * @param target
27 * @return
28 */
29 public static int[] twoSum1(int[]nums,int target) {
30 int[] ans = new int[2];
31 for (int i = 0; i < nums.length; i++) {
32 for (int j = i+1; j < nums.length; j++) {
33 if(nums[i]+nums[j] == target) {
34 ans[0] = i;
35 ans[1] = j;
36 }
37 }
38 }
39 return ans;
40 }
41
42 /**
43 * 方法2:不用遍历就能找出
44 * @param nums
45 * @param target
46 * @return
47 */
48 public static int[] twoSum2(int[] nums, int target) {
49 int[] ans = new int[2];
50 Map<Integer,Integer> map = new HashMap<Integer,Integer>();
51 for (int i = 0; i < ans.length; i++) {
52 map.put(nums[i],i);
53 }
54 for (int i = 0; i < ans.length; i++) {
55 int two = target - nums[i];
56 // if(map.containsKey(two) && target != 2*two) {
57 // ans[0] = map.get(two);
58 // ans[1] = i;
59 // return ans;
60 // }
61 if(map.containsKey(two)&&map.get(two)!=i){
62 return new int[]{i,map.get(two)};
63 }
64 }
65 throw new IllegalArgumentException("No two sum solution");
66 }
67
68
69 /**
70 * 方法3:对方法2分析,方法2中存在两个同样的for循环,可以对此进行合并,只是不需要判断是否是当前元素了
71 * @param nums
72 * @param target
73 * @return
74 */
75 public static List<Integer> twoSum3(int[] nums, int target) {
76 List<Integer> twoList = new ArrayList<>();
77 Map<Integer,Integer> map = new HashMap<Integer,Integer>();
78 for (int i = 0; i < nums.length; i++) {
79 int two = target - nums[i];
80 if(map.containsKey(two)) {
81 twoList.add(map.get(two));
82 twoList.add(i);
83 }
84 map.put(nums[i], i);
85 }
86 return twoList;
87 }
88 }