找出无序数组中的两个数的和为这个值的元素,不能使用额外的空间复杂度(不要使用HashMap)
不使用hashMap的做法,那么就使用两个for循环的方式,这样做的时间复杂度是O(N2)
public static void twoElementSum(int[] array, int element) {
for (int i=0;i<array.length;i++) {
for (int j=i+1;j<array.length;j++) {
if (array[i] + array[j] == element) {
System.out.println("第一个元素的位置:" + (i + 1) + ",第一个元素为" +array[i]);
System.out.println("第二个元素的位置:" + (j + 1) + ",第二个元素为" +array[j]);
}
}
}
}
采用hashMap集合的方式,首先将数组的value和其下标分别作为Map集合的key和value,然后遍历整个Map,使用两个值做差,得到另一个key,再通过map集合找到另一个key在数组中的下标。
这样做,因为hash查找的时间复杂度是O(1),所以整体的时间复杂度是O(N)
// 找到这两个数的下标并返回(以长度为2的数组的形式返回)
private static int[] getIndex(int[] arr, int num) {
int[] ret = new int[2];
HashMap<Integer, Integer> hashMap = new HashMap<>();
int index = 0;
// 将每个数字和其下标放进map中
for (Integer curr : arr) {
hashMap.put(curr, index++);
}
// 遍历HashMap并判断
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
// 获取map的key,也就是数组中的value
int value = entry.getKey();
// 通过需要得到的值和获取的key做减法,得到另一个key,也就是数组中的另一个value
int subValue = num - value;
if (hashMap.containsKey(subValue)) {
// 找到啦!
ret[0] = entry.getValue();
ret[1] = hashMap.get(subValue);
if (ret[0] < ret[1])
System.out.println("index of two numbers R:" + ret[0] + " " + ret[1]);
// break;
}
}
return ret;
}