知识点
- 寻找循环体中目标值之间的关系来减少循环层数 (利用关系建立查找对方的数据结构来空间换时间)
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
解法1:暴力破解
class Solution {
public int[] twoSum(int[] nums, int target) {
//ArrayList res = new ArrayList()<Integer>;
int[] res = new int[2];
for(int i=0;i<nums.length;i++){
for(int j = i+1;j<nums.length;j++){
if(nums[i]+nums[j] == target){
res[0]=i;
res[1]=j;
return res;
}
}
}
return res;
}
}
时间复杂度: O(n2) ,n为数组长度
空间复杂度: O(1) ,常数个临时变量 res[],i,j
解法2 查找表法
知识点1: 寻找循环体中目标值之间的关系来减少循环层数(空间换时间),便利的同时通过记录一些利用关系可以查询到另一方的信息来减少循环次数。
该题中
循环体的关系: 两个答案之间的关系是和为target
需记录的信息: 便利过的数值和下标
查找表的两种常用实现:
- 哈希表
- 平衡二叉搜索树
import java.util.*;
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target - nums[i])){
return new int[]{i,map.get(target - nums[i])};
}
map.put(nums[i],i);
}
return null;
}
}
时间复杂度: O(n) , n为数组长度
空间复杂度: O(n) ,最多存n-1个