1.经典两数之和
给定一个整数数组nums,和一个目标值target,找出数组中两个数,使他们的和等于target,输出他们的下标。
java
import java.util.HashMap;
public class Test{
public static void main(String[] args){
Test t = new Test();
t.twoSum2();
}
void twoSum1(){
int[] arr = {1,2,3,4,5,6,7,8,9};
int target = 6;
int index1=0;
int index2=0;
System.out.println("target="+target);
for(int i=0;i<arr.length;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]+arr[j]==target){
index1=i;
index2=j;
System.out.printf("\n%d, %d", i, j);
//System.out.println("index1="+index1+",value="+arr[index1]+", index2="+index2+",value="+arr[index2]);
}
}
}
}
//1.用HasmMap存储值->下标
//2.遍历数组,对每个数:
//计算需要的补数
//如果补数已经在map里面,直接输出map.get(complement), i
//把当前num和下标i存入map
void twoSum2(){
int[] arr = {1,2,3,4,5,6,7,8,9};
int target = 6;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0;i<arr.length;i++){
int num = target - arr[i];
if(map.containsKey(num)){
System.out.printf("\n%d, %d", i, map.get(num));
//System.out.printf("\narr[%d]=%d, arr[%d]=%d",i,arr[i], map.get(num), num);
}
map.put(arr[i],i);
}
}
}
- 方法1双重循环时间复杂度O(n^2)
- 方法2哈希表解法,用空间换时间,只需要一重循环遍历,时间复杂度O(n),空间复杂度O(n)