1.问题描述
任给一个整数数组num,一个目标值target,返回这样的一对下标[i,j],要求满足两个下标对应的数组值之和num[i]+num[j]等于target
2.算法介绍
2.1 时间复杂度为O(n^2)
双重循环,蛮力
public class Solution {
public int[] twoSum(int[] nums, int target) {
int result[]=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[j]==target-nums[i]){
result[0]=i;result[1]=j;
return result;
}
}
}
throw new IllegalArgumentException("NO");
}
}
2.2 时间复杂度为O(n)
单重循环,同时利用HashMap,快速O(1)查询
public int[] twoSun_update(int[] nums,int target){
int result[]=new int[2];
Map<Integer,Integer> table=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
table.put(nums[i],i);
int complement=target-nums[i];
if (table.containsKey(complement)) {
result[0]=i;result[1]=table.get(complement);
return result;
}
}
throw new IllegalArgumentException("NO");
}
上述算法是在将数组转化为map的同时进行检验。当然,我们也可以先转化后检验,时间复杂度不变。