题目描述
给定一个数组,找到两个总和为特定值的索引。
例如给定数组[1,2,3,-2,5,7],给定总和7,则返回索引[1,4]。若有多组符合情况则输出索引对中小索引最小的一组。
输入描述
第一行为给定数组的长度,不超过100。
第二行为数组元素,元素大小不超过100(可能为负数)。第三行为特定值。
输出描述
输出一行,为两个索引值,升序输出。
输入输出样例
示例
6
1 2 3 -2 5 7
7
输出
1 4
暴力解法,时间复杂度为o(n^2):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
}
int target=sc.nextInt();
for (int i = 0; i < arr.length; i++) {
for (int j=i+1;j<arr.length;j++){
if (arr[i]+arr[j]==target){
System.out.println(i+" "+j);
return;
}
}
}
}
}
优化版本,时间复杂度为o(n):
import java.util.HashMap;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//通过key去获取value
HashMap<Integer,Integer> map=new HashMap<>();
int n=sc.nextInt();
int[] arr=new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
map.put(arr[i],i);
}
int target=sc.nextInt();
for (int i = 0; i < arr.length; i++) {
int num=arr[i];
//containsKey函数:如果存在就返回True 时间复杂度可以看作o(1)
//哈希表的所有操作可以看成o(1)
if (map.containsKey(target-num)){
System.out.println(i+" "+map.get(target-num));
return;
}
}
}
}