一题多写(2),打牢基础,哈希map相关用法

 本章是哈希相关的知识,题目用哈希相关知识来解 ,相关知识:java集合通用方法-优快云博客

高效学习HashMap:

        Map<Integer,Integer>setMap=new HashMap<>();

<_1_,_2_>,1的位置是键,2的位置是值,不可重复,值可重复(就是说键不可以相同,而值可以相同),1,2位置可填写不同类型,常用的有String,Integer,Character,Double,Float,Long,Short,Byte等,注意开头都是大写,根据要储存的值来决定添什么类型。

hashmap就像一个高效的搜索引擎,将数据存放在里面后,通过“键”就能快速的找到,不用在一个一个式的遍历查找需要的元素。

HashMap 是一种基于哈希表的数据结构,它通过“键”来高效地存储和检索对应的“值”。其核心思想是使用哈希函数将“键”映射到一个特定的索引位置,从而将数据存储在哈希表的相应位置中。当需要查找某个“值”时,HashMap 会再次通过哈希函数快速定位到该“键”对应的索引位置,直接访问存储的“值”,而不需要像数组或列表那样逐个遍历查找。这种机制使得 HashMap 的查找、插入和删除操作在平均情况下具有 O(1) 的时间复杂度,非常高效。

hashmap常用方法

  • put(K key, V value):将指定的键值对插入到 HashMap 中。如果键已经存在,则更新对应的值。(键是不可重复的)
  • get(Object key):根据键获取对应的值。如果键不存在,则返回 null
  • remove(Object key):根据键删除对应的键值对。
  • containsKey(Object key):检查 HashMap 中是否包含指定的键。
  • containsValue(Object value):检查 HashMap 中是否包含指定的值。
  • keySet():返回 HashMap 中所有键的集合。
  • values():返回 HashMap 中所有值的集合。
  • entrySet():返回 HashMap 中所有键值对的集合。

通过这一题,让我们知道HashMap的好处,为什么用HashMap,以及以后什么时候还用HashMap

1. 两数之和

思路一:

暴力遍历所有结果,将各个元素进行相加,找到可以成功的值,返回其索引;

class Solution {
    public int[] twoSum(int[] nums, int target) {
       int[]arr=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) {
                    arr[0]=i;
                    arr[1]=j;
                    break;
                }
            }
        }
        return arr;
    }
}

思路二:

法一:

用HashMap进行优化,

为了便于理解HashMap的作用

我们可以将所用的元素一次性的全部添加到HashMap中,for循环+hash.put(nums[i],i);进行数据存放

再依次判断是否存在,(高效的引擎快速能快速查找到)hash.containsKey(target-nums[i])

同时要注意不能使用两次相同的元素这一条件,hash.get(target-nums[i])!=i,这样找到的元素索引就不会一样,不会两次使用相同的元素;

与思路一中的暴力双循环相比较,HashMap的好处是进行存储要查询的元素,以便快速找到,达到避免再加一层for循环再次进行查找的作用。

这种写法有弊端------如果数组中有多个相同的元素,HashMap 只会存储最后一个元素的索引。

这题的解法巧妙解决了这个问题,当有重复的元素时,不会查找i==hash.get(target-nums[i])时的元素(已被覆盖掉了),而是可以查找i!=hash.get(target-nums[i])即重复元素最后的出现(重复元素最后保留下来的)。但是普适性还是法二更好

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[]arr=new int[2];
        HashMap<Integer,Integer> hash=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            hash.put(nums[i],i);
        }
        for(int i=0;i<nums.length;i++){
            if(hash.containsKey(target-nums[i])&&hash.get(target-nums[i])!=i){
                arr[0]=i;
                arr[1]=hash.get(target-nums[i]);
                break;
            }
        }return arr;
    }
}

法二:

将元素用hashmap依次进行存储,

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[]arr=new int[2];
        int n=nums.length;
        Map<Integer,Integer>setMap=new HashMap<>();
        for(int i=0;i<n;i++){
            if(setMap.containsKey(target-nums[i])){
                arr[1]=i;
                arr[0]=setMap.get(target-nums[i]);
                break;
            }else{
                setMap.put(nums[i],i);
            }
        }return arr;
    }
}

        遍历原数组,每一次都进行查找是否存在合适的键的元素,如果没有就进行添加循环到索引i的nums[i]元素为“键”,并将i作为“值”进行存储,这样既可以快速找到合适的元素,并且也可以通过键返回的值作为原数组的索引。

        通俗一点,就是说,每一次查询元素index索引比哈希表map中的总长度length还要大一,  (target-nums[1];hashMap中没有存如一个键值对,target-nums[2];hashMap中有一个键值对......)因此,索引i和setMap.get(target-nums[i])不会一样。

 记忆哈希用法窍门:

       想要在hashmap中快速查找一个元素(A,索引n),哈希表中保存的是这个元素之前的所有元素(0,1,2,3,...,n-1),在0--n-1中查找,如果没有,才将这个当前索引n的元素存放在hashmap中。

“值”是要查询的结果,“值”是目标!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值