LeetCode百题刷004(哈希表优化两数和问题)

遇到的问题都有解决的方案,希望我的博客可以为你提供一些帮助

一、哈希策略优化两数和问题

题目地址:1. 两数之和 - 力扣(LeetCode)https://leetcode.cn/problems/two-sum/description/

思路分析:

题目要求在一个整型数组nums中找到两个数(不能是自己)的和满足所给的目标值target,其实就是需要对这个整型数组进行两次遍历,判断对于每个数组元素nums[i],是否存在target-nums[i]在这个整型数组里边。

于是就有了第一种解法:

解法一:暴力枚举法

外循环确定当前元素nums[i],内循环在当前元素后寻找使nums[i]值为target的补数target-nums[i],

为什么内循环需要在当前元素后寻找呢?这就像相亲一样,首先不和自己本身相亲(满足一个数不能重复使用)其次如果0号和1号元素相亲后发现不合适(外层第一次循环)那么1号和0号元素就没有必要再相亲一次(外层第二次循环)。

时间复杂度:双循环

空间复杂度:无额外的空间开销

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[i]+nums[j])==target)return new int []{i,j};
        }
        return new int[0];
    }
}

解法二:哈希表法

如何去优化呢?在方法一中我们可以发现它的本质是两层遍历数组进行查找,外循环的目的是枚举出每一个数组元素,内循环的目的是找到对应的补数。对于外循环我们无法优化,因为它的目的是枚举出每一个数组元素,无论如何去优化它,时间复杂度始终都是。其次我们考虑内循环是否可以优化?首先内循环完成的是一个什么任务呢?内循环需要在数组中查找数组元素的补数,抽象一下就是说内循环需要判断出在一个数组内是否有某一个元素。然后,我们需要思考的是有哪些方法可以快速判断出一个数组中是否有某一个元素呢?遍历?有比遍历更快的吗?哈希表?因为哈希表 有个O(1) 的查询特性。

时间复杂度:哈希表优化的内循环

空间复杂度:哈希表有空间开销

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> numberTable=new HashMap <Integer,Integer>();
        for(int i=0; i<nums.length; ++i){
            //查找nums[i]的补数
            if(numberTable.containsKey(target-nums[i]))
                return new int[] {i,numberTable.get(target-nums[i])};
            numberTable.put(nums[i],i);
            //为啥numberTable.put(nums[i],i);写在这里,
            //而不是先在循环外建立一个哈希表然后把每一个数组元素先放进去呢?
            //因为其实每一组符合要求的数其实有两次比较的机会,
            //比如x的下标为5,它的补数的下标为10,
            //循环遍历到x的时候发现哈希表内没找到x的补数,
            //直接把x存入哈希表,到10的时候因为X在哈希表内所以成功。
            //最好的情况下这种方式更节约空间
        }
        return new int[0];
    }
}
相关推荐
啥都想学的又啥都不会的研究生1 小时前
常规算法学习
java·数据结构·b树·学习·算法·排序算法
I AM_SUN2 小时前
153. 寻找旋转排序数组中的最小值
数据结构·c++·算法·leetcode·二分法
小白菜又菜3 小时前
Leetcode 2942. Find Words Containing Character
算法·leetcode·职场和发展
蒟蒻小袁4 小时前
力扣面试150题--二叉树的最近公共祖先
leetcode·面试·深度优先
数据与人工智能律师8 小时前
加密货币投资亏损后,能否以“欺诈”或“不当销售”索赔?
大数据·网络·算法·云计算·区块链
努力学习的小廉8 小时前
我爱学算法之—— 二分查找(下)
算法
AdSet聚合广告8 小时前
APP广告变现,开发者如何判断对接的广告SDK安全合规?
大数据·后端·算法·安全·uni-app
不二狗8 小时前
每日算法 -【Swift 算法】实现回文数判断!
开发语言·算法·swift
梁下轻语的秋缘11 小时前
Python人工智能算法 模拟退火算法求解01背包问题:从理论到实践的完整攻略
人工智能·python·算法·数学建模·模拟退火算法
Smile灬凉城66611 小时前
IPsec协议
考研·数学·算法