题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
方案一:暴力破解,循环遍历两个数,判断相加为target时返回两个角标。显然时间复杂度不好。
方案二:遍历一个数,另一个数target-nums[i]先保存进hashmap中。代码如下:
@Test public void test1(){ int[] arr = {1,2,3,4,5,6}; int target = 9; int[] index = getIndex(arr,target); System.out.println(1111); } private int[] getIndex(int[] arr, int target) { int[] result = new int[arr.length]; Map<Integer,Integer> map = new HashMap<>(); //时间复杂度限制为o(n),第一遍循环遍历将数据于hashmap建立关系。 for (int i = 0;i<arr.length;i++){ map.put(arr[i],i); } for(int i=0;i<arr.length;i++){ //第二遍循环遍历去获取两个加数的角标,注意判断第二个数不能与第一个数重复 if(map.containsKey(target-arr[i]) && map.get(target-arr[i])!=i){ result[0] = i; result[1] = map.get(target-arr[i]); break; } } return result; } |