让子弹飞一会1

导航

(一天一练)算法学习

题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 }

 

posted on 2020-10-10 11:47  让子弹飞一会1  阅读(29)  评论(0)    收藏  举报