给一个包含多个数的数组和一个目标数,找出该数组内两个不同的数使其相加等于目标,输出两数的索引;
例如int nums[] = {1,2,3,4};
int target = 3;
输出[0,1];
三种解决方案
一和三利用sun官方优化jdk hash查找算法可将时间复杂度降至O(n);
二是自己想的思路,很大众很平常,不过代码忘了保存,所以也抄了答案。
我觉得主要注意 两个数要求不是同一个数,令j = i + 1即可;
package test.com;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
int[] a = new int[10000];
for(int i = 0;i < 10000;i++) {
a[i] = i;
}
int c[] = new Test().twoSum2(a,12000);
System.out.println(c[0]+","+c[1]);
}
public int[] twoSum(int[] nums, int target) {
long a = System.currentTimeMillis();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
long b = System.currentTimeMillis();
System.out.println(b - a);
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
public int[] twoSum2(int[] nums, int target) {
long a = System.currentTimeMillis();
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
long b = System.currentTimeMillis();
System.out.println(b - a);
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
public int[] twoSum3(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
//值为键,索引为值;利用已经优化过的hash查找算法;
}