目录
1.两数之和
1.1.题目描述
- 给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
1.2.解法一:暴力循环
- 两重循环,遍历所有情况看相加是否等于目标和。
- 时间复杂度:两层 for 循环,O(n²)
- 空间复杂度:O(1)
public int[] twoSum(int[] nums, int target) {
int[] ans=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){
ans[0]=i;
ans[1]=j;
}
}
}
return ans;
}
1.3.解法二:哈希表
- 使用Map集合以键值对形式存储数组元素及对应下标
- 查看Map中是否存在(target-nums[i])的键,还需判断找到的元素不是当前元素,因为题目里讲一个元素只能用一次。
- 时间复杂度:比解法一少了一个 for 循环,降为 O(n)
- 空间复杂度:空间换时间, 开辟了一个哈希表 ,空间复杂度变为 O(n)
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
int sub=target-nums[i];
if(map.containsKey(sub)&&map.get(sub)!=i){
return new int[]{i,map.get(sub)};
}
}
throw new IllegalArgumentException("No two sum solution");
}