Leetcode的AC指南 —— 哈希法:1. 两数之和
2023-12-25 22:56:41
摘要:
Leetcode的AC指南 —— 哈希法:1. 两数之和。题目介绍:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
一、题目
题目介绍:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
- 2 <= nums.length <= 104
- -109 <= nums[i] <= 109
- -109 <= target <= 109
- 只会存在一个有效答案
进阶:
- 你可以想出一个时间复杂度小于 O(n2) 的算法吗?
二、解析
1、暴力解法
public static int[] twoSum(int[] nums, int target) {
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;
}
- 时间复杂度O(nlog(n))
- 空间复杂度O(1)
2、哈希法 —— 字典
- 什么时候使用哈希法:当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
- 哈希法的数据结构:
- 数组:数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
- set:set是一个集合,里面放的元素只能是一个key,且无序,不重复,无索引
- map:map是一种key value的存储结构。无序,不重复,无索引。
思路:
- 创建一个字典,key存储访问过的元素,value存储该元素对应的数组下标。
- 遍历数组,查找访问过的元素中是否有满足两数之和的key
- 有,返回当前元素下标,和字典中对应temp的value值(也就是temp对应的数组下标)
- 没有,将当前元素和对应下标存入字典,访问下一个元素。
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
break;
}
map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return res;
}
- 时间复杂度: O(n)
- 空间复杂度: O(n)
文章来源:https://blog.csdn.net/Huacyu/article/details/135117353
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!