力扣打卡DAY01

没想到走着走着就大三了,回头一看,发现自己确实什么都不懂,所以想要从今天开始好好开始学一点东西,在学长的推荐下,开始刷力扣,一天一题(也许有的时候来不及发博文就不会发了,但是自己还是会做的,并且尽力每天打卡)

题目一:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

最开始相比大家都会有一些的思路,那就是可以使用暴力求解,没错,我的第一想法就是这样的,随后我就得到的下面的代码。

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

这样确实可以得到最终解,但是首先看题目,加强版就是你能不能得到一个时间复杂度小于O(n^2)的方法,那证明是有其他方法的,观看了评论区后发现,soga,大佬果然是大佬,原来还有这种方法---------使用哈希表。(没看到这篇文章我都忘记哈希表是什么了!)

随后我就乖乖的去温习了什么是哈希表以及哈希表的使用,整理如下:

【哈希表的学习】

1.为什么会存在哈希表?

哈希表又称为散列表,因为我们在采用数组、树等数据结构存储数据的时候,若我们想要查找其中的内容,那我们就需要进行大量的比较,那么会不会存在一种方式不需要比较就可以查找到?当然存在,那就需要散列表这个数据结构了,当然,散列表不需要查找便可以找到对应的数据也是在理想情况下实现的!【所谓理想情况就是只是理想状况下,其实还是需要比较的】

2. 哈希表的应用

哈希表的存储方式有以下几种:

①直接寻址法

所谓直接寻址法就是为每一个数据赋予一个地址

缺点:造成地址空间的浪费!!

②数字分析法

数字分析法就是找出关键字 的规律,尽可能用差异数据来构造Hash地址 

缺点:需要找到所有的数据组成才能使用此方法

③平方取中法

先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。

④折叠法

将关键字分割成位数相同的几部分(最后一部分位数可以不同),然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。

⑤随机数法

选择一个随机函数,取关键字的随机函数值作为Hash地址 ,通常用于关键字长度不同的场合。

⑥除留取余法

取关键字被某个不大于Hash表 长m 的数p 除后所得的余数为Hash地址 。

特点:这是最常用的方法。

=========================================================================

那么有了构建了哈希表之后,就必然会产生冲突,那么如何解决冲突?

【“冲突”是指一个位置上已经存在数据之后,此时我还需要将数据放在这个位置,就会产生冲突

①开放定址法

②再哈希法

 均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生,这种方法不易产生聚集 ,但增加了计算时间。

③链地址法

将所有关键字为同义词的记录存储在同一线性表中。即在Hash 出来的哈希地址中不直接存Key ,而是存储一个Key 的链表 ,当发生冲突 时,将同义的Key 加入链表。

④公共溢出法

(当然,我在查资料的时候看到一位博主的文章讲解,实在是 一个字 ,牛,推荐大家去看看)

转载:

(16条消息) java中哈希表及其应用详解_xiaoxik的博客-CSDN博客_java 哈希表

========================================================================

了解了上面的相关内容之后,我们接下来需要做的就是了解最基本的:哈希表在Java中是怎么使用的。

1. 导包
import java.util.HashMap;

2. 定义
HsahMap<Integer,Integer> hash = new HashMap<Integer,Integer>(); //参数定义使用的是基本类型的包装类

3. 常见用法
(1)hash.put(1,3); //在一位置存入对应的关键字
(2)hash.get(1); //获取一位置对应的关键字
(3)hash.containsKey(3) //用于判断某个关键字是否在哈希表中存在,返回值为true 或者false
4. 哈希表的构造方法

① public Hashtable()

② public Hashtable(int initialCapacity)

③ public Hashtable(int initialCapacity,float loadFactor)

其中参数initialCapacity是Hashtable的初始容量,它的值应大于0。loadFactor又称装载因子,是一个0.0到0.1之间的float型的浮点数。但是在Java中一般规定装填因子的大小为0.75

好,大概就了解上面的这些,我们接下来就看看如何使用哈希表实现计算两数之和使得时间复杂度小于O(n^2)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] indexs = new int[2];
        
        // 建立k-v ,一一对应的哈希表
        HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
        for(int i = 0; i < nums.length; i++){
            if(hash.containsKey(nums[i])){
                indexs[0] = i;
                indexs[1] = hash.get(nums[i]);
                return indexs;
            }
            // 将数据存入 key为补数 ,value为下标
            hash.put(target-nums[i],i);
        }
}

以上就是我的学习成果了,大家加油!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值