首页 > 编程语言 >代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数组的交集 Leetcode202 快乐数Leetcode1 两数之和

代码随想录 算法训练营 d6 哈希表 Leetcode242 有效的字母异位词 Leetcode349 两个数组的交集 Leetcode202 快乐数Leetcode1 两数之和

时间:2024-06-11 22:43:27浏览次数:29  
标签:Leetcode242 return 数组 int 元素 随想录 哈希 new 两数

哈希表 很重要

哈希表

哈希表 场景 一般哈希表都是用来快速判断一个元素是否出现集合里

一般来说 数组模拟 哈希set  哈希map 不同的场景

 

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!

Leetcode242 有效的字母异位词

题目链接

若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

用哈希表 去保存字符串的次数 如果最后归0 则是异位词

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];
        for(int i = 0;i<s.length();i++){
            record[(s.charAt(i)-'a')]++;
        }
        for(int i = 0;i<t.length();i++){
            record[t.charAt(i)-'a']--;
        }
        for(int i = 0;i<record.length;i++){
            if(record[i]!=0){
                return false;
            }
        }
        return true;
    }
}

Leetcode349  两个数组的交集

题目链接

给定两个数组 返回交集 元素唯一

思想:看到元素唯一 可以想到用哈希表的set结构 先 设置一个哈希表存储第一个数组

然后设置一个结果哈希表,遍历第二个数组的时候 如果第一个哈希表中存在 那么添加到结果哈希表中即可

注意 hashset用法 以及 流的使用

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null||nums2==null||nums1.length==0||nums2.length==0){
            return new int[0];
        }

        Set<Integer> reset = new HashSet<>();
        Set<Integer> set1 = new HashSet<>();

        for(int i = 0;i<nums1.length;i++){
            set1.add(nums1[i]);
        }
        for(int i = 0;i<nums2.length;i++){
            if(set1.contains(nums2[i])){
                reset.add(nums2[i]);
            }
        }
        return reset.stream().mapToInt(x -> x).toArray();
    }
}

Leetcode202 快乐数

题目链接

注意此题  也可能是 无限循环 但始终变不到 1  非常关键

会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> sum = new HashSet<>(); 
        while(n!=1&& !sum.contains(n)){
            sum.add(n);
            n = getNext(n);
        }
        if(n==1){
            return true;
        }else{
            return false;
        }
    }
    public int getNext(int n){
        int a = 0;
        while(n>0){
            int temp = n%10;
            temp = temp*temp;
            a+=temp;
            n/=10;
        }
        return a;
    }
}

Leetcode1 两数之和

题目链接

经典哈希表题目 

理清思路 用哈希表存储元素和他的需要的值

再强调一下 什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适

map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)

 

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        Map<Integer, Integer> map = new HashMap<>();
        if(nums == null|| nums.length ==0){
            return res;
        }
        for(int i = 0;i<nums.length;i++){
            int a = target - nums[i];
            if(map.containsKey(a)){
                res[0] = i;
                res[1] = map.get(a);
                return res;
            }
            map.put(nums[i],i);
        }
        return res;
    }
}

 

标签:Leetcode242,return,数组,int,元素,随想录,哈希,new,两数
From: https://www.cnblogs.com/determination-e/p/18242920

相关文章

  • 代码随想录算法训练营第9天 |
    28.strStr()https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/实现strStr()代码随想录https://programmercarl.com/0028.实现strStr.html#思路459.重复字符串https://leetcode.cn/problems/repeated-substring-pattern/submis......
  • 代码随想录算法训练营第七天 |
    454.四数相加题目:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0解题:思路:使用map,key为a+b,value为出现次数。再遍历k、l寻找0-a-b。关键:遍历......
  • 代码随想录算法训练营第三十五天 | 1005.K次取反后最大化的数组和 134.加油站 135.分
    1005.K次取反后最大化的数组和题目链接文章讲解视频讲解思路:  按绝对值从大到小排序  遍历数组,遇到负数,如果次数未用完就取反  最后如果剩余次数未用完且为奇数就将数组最后一个元素取反classSolution{staticboolmyCompare(constint&lhs,constint&r......
  • Q23 LeetCode242 字母异位词
    1.先进行简单的字符长度判断,不相等直接返回false;2.containsKey()的使用3.在减减循环14-17行里判别key的value是否为0,要不然会报错 1classSolution{2publicbooleanisAnagram(Strings,Stringt){3if(s.length()!=t.length()){4return......
  • 代码随想录——数组
    给定一个n个元素有序(升序)的整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1.//这个题说实话从逻辑上来看实在是太简单了,但是为什么每一次我写起来都感觉隐隐约约有点问题,为什么呢?就是因为我的问题没有得到解决,我只是一味的去逃......
  • 代码随想录算法训练营第六天
    哈希表常见的三种哈希结构:数组、set(集合)、map(映射)要快速判断一个元素是否出现集合里,考虑哈希法!242.有效的字母异位词题目:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。解题:......
  • 代码随想录算法训练营第十四天|二叉树递归遍历、迭代遍历、统一迭代
    二叉树遍历二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走。深度优先遍历又分:前序遍历(中、左、右)中序遍历(左、中、右)后序遍历(左、右、中)广度优先遍历:一层一层的去遍历。(后面讲)递归遍历递归三要素确定递归函数的参数和返回值:确定哪些参数是递......
  • Day47 代码随想录打卡|二叉树篇---最大二叉树
    题目(leecodeT654):给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nu......
  • 代码随想录算法训练营 day31 | 455.分发饼干 376.摆动序列 53.最大子数组和
    376.摆动序列说实话,没明白为啥算是贪心。最开始的思路是去重,然后统计正负变化次数。classSolution{public:intwiggleMaxLength(vector<int>&nums){if(nums.size()==1)return1;intans=0,last=-2,now;for(inti=1;i<nums.size();......
  • 代码随想录第4天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 0
    题目:24.两两交换链表中的节点思路:设置虚拟头结点,双指针+临时指针,(感觉也能递归,未尝试)时间复杂度:O(n)空间复杂度:O(1)坑:1.又忘了else{}和return2.试图访问空指针,多个条件的顺序问题及"&&""||"问题,cur->next要写在cur->next->next前面/***Definitionforsingly-linked......