解决两数之和问题的哈希表方法

这篇具有很好参考价值的文章主要介绍了解决两数之和问题的哈希表方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈希表使用                                      O                          (                          N                          )                               O(N)                   O(N) 空间复杂度存储数据,并且以                                      O                          (                          1                          )                               O(1)                   O(1) 时间复杂度求解问题。

❓1. 两数之和

难度:简单

给定一个整数数组 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                          <                          =                          n                          u                          m                          s                          .                          l                          e                          n                          g                          t                          h                          <                          =                          1                                   0                             4                                         2 <= nums.length <= 10^4                   2<=nums.length<=104

  •                                      −                          1                                   0                             9                                    <                          =                          n                          u                          m                          s                          [                          i                          ]                          <                          =                          1                                   0                             9                                         -10^9 <= nums[i] <= 10^9                   109<=nums[i]<=109

  •                                      −                          1                                   0                             9                                    <                          =                          t                          a                          r                          g                          e                          t                          <                          =                          1                                   0                             9                                         -10^9 <= target <= 10^9                   109<=target<=109

  • 只会存在一个有效答案

进阶: 你可以想出一个时间复杂度小于 O(n2) 的算法吗?

💡思路:

求两数之和可以先对数组进行排序,然后使用双指针方法或者二分查找方法。这样做的时间复杂度为                               O                       (                       N                       l                       o                       g                       N                       )                            O(NlogN)                O(NlogN),空间复杂度为                               O                       (                       1                       )                            O(1)                O(1)。但是该题目是返回数组下标,所以不能先排序!

法一:暴力枚举

最容易想到的方法是枚举数组中的每一个数 nums[i],寻找数组中是否存在 target - nums[i]

当我们使用遍历整个数组的方式寻找 target - nums[i] 时,需要注意到每一个位于 nums[i] 之前的元素都已经和 nums[i] 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 nums[i] 后面的元素中寻找 target - nums[i]

法二:哈希表

HashMap 存储数组元素和索引的映射: (使用空间来换取时间)

  • 在访问到 nums[i] 时,判断 HashMap 中是否存在target - nums[i]

  • 如果存在说明target - nums[i]所在的索引和 i 就是要找的两个数。

  • 如果不存在则将{nums[i], i}加入哈希表。

🍁代码:(Java、C++)

法一:暴力枚举
Java

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i = 0;i<nums.length;i++){
			for(int j=i+1; j<nums.length;j++){
				if(nums[j] == target - nums[i]){
					return new int[]{i,j};
				}
			}
		}
		return null;
    }}

法二:哈希表
Java

class Solution {
    public int[] twoSum(int[] nums, int target) {
       HashMap<Integer, Integer> indexForNUm = new HashMap<>();
       for(int i = 0; i < nums.length; i++){
           if(indexForNUm.containsKey(target - nums[i])){
               return new int[]{i, indexForNUm.get(target - nums[i])};
           }else{
               indexForNUm.put(nums[i], i);
           }
       }
        return null;
    }}

C++

class Solution {public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> indexForNum;
        for(int i = 0; i < nums.size(); i++){
            if(indexForNum.find(target - nums[i]) != indexForNum.end()){
                return {i, indexForNum[target - nums[i]]};
            }else{
                indexForNum.insert({nums[i], i});
            }
        }
        return {};
    }};

🚀 运行结果:

两数之和,哈希表,算法,Java,C++

🕔 复杂度分析:
  • 时间复杂度                                      O                          (                          n                          )                               O(n)                   O(n),其中 n 是数组中的元素数量。对于每一个元素 num[i],我们可以                                      O                          (                          1                          )                               O(1)                   O(1) 地寻找 target - num[i]。暴力求解时间复杂度为                                      O                          (                                   n                             2                                    )                               O(n^2)                   O(n2)

  • 空间复杂度                                      O                          (                          n                          )                               O(n)                   O(n),其中 n 是数组中的元素数量,主要为哈希表的开销。暴力求解空间复杂度为                                      O                          (                          1                          )                               O(1)                   O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!文章来源地址https://www.toymoban.com/news/detail-427522.html

注: 如有不足,欢迎指正!

到了这里,关于解决两数之和问题的哈希表方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包