首页 > 其他分享 >【代码随想录Day6】哈希表Part01|判断一个元素是否出现集合里

【代码随想录Day6】哈希表Part01|判断一个元素是否出现集合里

时间:2024-09-02 15:53:06浏览次数:12  
标签:遍历 hash record Day6 元素 随想录 ++ Part01 int

哈希表理论基础

文章讲解:哈希表理论基础
要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

242.有效的字母异位词

题目链接/文章讲解/视频讲解: 有效的字母异位词

定义一个哈希表 record
遍历 s, 记录 s 中每个字母出现的次数,
遍历 t,减去 t 中每个字母出现的次数,
遍历 record,看是否都为 0

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        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 < 26; i++) {
            if (record[i] != 0) {
                return false;
            }
        }
        return true;
    }
}

349.两个数组的交集

题目链接/文章讲解/视频讲解:两个数组的交集

  1. 标记 nums1 中的元素:
    ○ 遍历 nums1,将每个唯一元素标记为 hash[num] = 1
  2. 检查 nums2 中的元素:
    ○ 遍历 nums2,检查元素是否已经在 hash 中标记(即 hash[num] == 1)。
    ○ 如果是,将 hash[num] = 2 并增加 count 以跟踪交集元素的数量。
  3. 收集交集元素:
    ○ 创建一个大小为 count 的结果数组。
    ○ 遍历 hash 数组,将 hash[i] == 2 的元素收集到结果数组中。
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash = new int[1001];
        int count = 0;
        // 标记nums1中的元素
        for (int i = 0; i < nums1.length; i++) {
            if (hash[nums1[i]] == 0) {
                hash[nums1[i]] = 1;
            }
        }
        // 检查nums2中的元素并标记如果它们在两个数组中都存在
        for (int i = 0; i < nums2.length; i++) {
            if (hash[nums2[i]] == 1) {
                hash[nums2[i]] = 2;
                count++;
            }
        }
        // 收集交集元素
        int[] result = new int[count];
        int j = 0;
        for (int i = 0; i < 1001; i++) {
            if (hash[i] == 2) {
                result[j++] = i;
            }

        }
        return result;
    }
}

202.快乐数

题目链接/文章讲解:快乐数

  1. while (n != 1 && !record.contains(n)):该循环条件确保程序要么找到幸福数(即 n 变为 1),要么发现循环(即 n 重复出现)。
  2. record.add(n):添加当前数到记录集合。
  3. n = getNext(n):获取下一次平方和。
  4. getNext 方法负责计算一个数各个位上数字的平方和。
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        while (n != 1 && !record.contains(n)) {
            record.add(n);
            n = getNext(n);
        }
        return n == 1;
    }

    private int getNext(int n) {
        int sum = 0;
        while (n > 0) {
            int digit = n % 10;
            sum += digit * digit;
            n /= 10;
        }
        return sum;
    }

}

1.两数之和

题目链接/文章讲解/视频讲解:两数之和

  1. 初始化HashMap:
    • 创建一个HashMap对象indexMap,用于存储数组中的元素及其对应的索引。
  2. 遍历数组:
    • 使用for循环遍历数组中的每一个元素。
  3. 计算差值:
    • 对于每个元素,计算目标值target与当前元素nums[i]的差值balance
  4. 检查HashMap:
    • 检查indexMap中是否存在键为balance的元素。
    • 如果存在,说明找到了两个数,它们的和等于目标值。
      • 返回这两个数的索引,即当前索引ibalance对应的索引。
  5. 更新HashMap:
    • 如果indexMap中不存在键为balance的元素,则将当前元素nums[i]及其索引i存入indexMap
  6. 返回结果:
    • 如果在遍历结束后仍未找到符合条件的两个数,则返回null
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> indexMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int balance = target - nums[i];
            if (indexMap.containsKey(balance)) {
                return new int[] { i, indexMap.get(balance) };
            } else {
                indexMap.put(nums[i], i);
            }
        }
        return null;
    }
}

标签:遍历,hash,record,Day6,元素,随想录,++,Part01,int
From: https://blog.csdn.net/weixin_43724673/article/details/141822062

相关文章

  • 代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II
    739每日温度funcdailyTemperatures(temperatures[]int)[]int{ //双指针 varres=make([]int,len(temperatures)) fori:=0;i<len(temperatures);i++{ forj:=i+1;j<len(temperatures);j++{ iftemperatures[j]>temperatures[i]{ res[i]=j......
  • 代码随想录算法day4 - 哈希表2
    题目1454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4......
  • 代码随想录刷题day13丨二叉树理论基础,递归遍历,迭代遍历,统一迭代,层序遍历
    代码随想录刷题day13丨二叉树理论基础,递归遍历,迭代遍历,统一迭代,层序遍历1.二叉树理论基础1.1二叉树种类满二叉树概述:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节......
  • 「代码随想录算法训练营」第五十一天 | 图论 part9
    目录Bellman_ford算法模拟过程题目:94.城市间货物运输IBellman_ford队列优化算法(又名SPFA)模拟过程题目:94.城市间货物运输IBellman_ford算法之判断负权回路题目:95.城市间货物运输IIBellman_ford算法之单源有限最短路题目:96.城市间货物运输IIIBellman_ford算法Bellman_ford算法......
  • 代码随想录算法day5 - 哈希表1
    题目1242.有效的字母异位词给定两个字符串*s*和*t*,编写一个函数来判断*t*是否是*s*的字母异位词。字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,通常只使用所有原始字母一次。示例1:输入:s="anagram",t="nagaram"输出:true示例2:......
  • 「代码随想录算法训练营」第五十天 | 图论 part8
    目录拓扑排序题目:117.软件构建dijkstra(朴素版)题目:47.参加科学大会dijkstra算法和prim算法的区别dijkstra(堆优化版)题目:47.参加科学大会拓扑排序拓扑排序概括来说就是给出一个有向无环图,把这个有向无环图转成线性的排序,就叫拓扑排序。使用广度优先搜索(BFS)即可。如上图,当我们......
  • 代码随想录算法训练营,8月31日 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点
    24.两两交换链表中的节点题目链接:24.两两交换链表中的节点文档讲解︰代码随想录(programmercarl.com)视频讲解︰两两交换链表中的节点日期:2024-08-31做前思路:用上虚拟头指针,从头开始,先指向2再到1,再到3,但要注意保留原本的结点。Java代码如下:classSolution{publicListN......
  • 代码随想录day46 || 647 回文子串, 516 最长回文子序列
    647回文字串funccountSubstrings(sstring)int{ //动规五部曲 //dp[i][j]表示s[i:j+1]区间是否是一个回文 //ifs[i]==s[j]{ifi-j<=1||dp[i+1][j-1]==true{dp[i][j]==true}} //初始化为false //从下往上,从左往右 //print varcountint var......
  • 代码随想录算法day4 - 链表2
    题目124.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]......
  • 代码随想录算法训练营,8月30日 | 203.移除链表元素, 707.设计链表, 206.反转链表
    链表理论基础1.单链表:数据域和指针域(指向下一个结点的位置)组成,头结点,结尾为空指针;双链表:多了一个指向前一个结点的指针;循环链表:结尾指向头结点。2.链表在内存中的存储不是顺序的,跟数组不同,要找一个数据只能通过前一个数据来找,所有这就导致链表的查询比数组麻烦,但是插入删除数据......