day06补卡|哈希表专题1|Leetcode1、242、349、202|哈希数组、哈希Set、哈希Map|给你一个元素,判断是否在集合内出现过使用哈希方法;

Leetcode242:有效的字母异位词(哈希-数组)

题目链接:https://leetcode.cn/problems/valid-anagram/description/

题目分析:题干异此等判定的本质就是,组成字母及出现次数均相同即可判定为true;例如abcd 与 abcd 也算作异位词;所以我们只要判定两个字符串中字母(题干说只有小写字母)出现的频次是否相同;

思路:根据carl视频说的我们使用数组实现哈希方法去解决这道题

Java实现代码:

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()){
            return false;
        }
        int[] record = new int[26]; 
        int L=s.length();
        for(int i = 0;i 

代码实现逻辑大致为:

  1. 先判断字符串长度是否一致,不一致直接false
  2. recode用于存储26个字母出现频次   对应哈希方法:s.charAt(i)-'a' ;即a--0;b-1;......;z--25;
  3. 字符串一如果出现对应位置值++;字符串二如果出现对应位置值--;
  4. 所以两个字符串如果出现字母及频次相同,则数组所有值会被归零;遍历record,如果不为零直接return;
  5. 循环结束 即字母与频次均相同 return true;


Leetcode349:两个数组的交集(哈希-set、数组)

题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/description/

java实现:HashSet

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //判断是否有空,任意空 交集空
        if(nums1 == null ||nums1.length == 0 || nums2 == null ||nums2.length == 0){
            return new int[0];
        }
        //建 HashSet -set1存nums1结果;-resultSet 存交集
        Set set1 = new HashSet<>();
        Set resultSet = new HashSet<>();
        //遍历添加,HashSet自动去重
        for(int i :nums1){
            set1.add(i);
        }
        //遍历 nums2 如果set1存在,添加到resultSet
        for(int j:nums2){
            if(set1.contains(j)){
                resultSet.add(j);
            }
        }
        //使用流处理将hashset->数组
        return resultSet.stream().mapToInt(x->x).toArray();
    }
}

 java实现:哈希数组---与上一题思想一致

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //初始化创建两个int[1002]数组
        int[] hash1 = new int[1002];
        int[] hash2 = new int[1002];
        //存储两个数组结果
        for(int i : nums1)
            hash1[i]++;
        for(int i : nums2)
            hash2[i]++;
        //创建List用于保存结果
        List resList = new ArrayList<>();
        for(int i = 0; i < 1002; i++)
            if(hash1[i] > 0 && hash2[i] > 0)
                resList.add(i);
        //由List->int[]
        int index = 0;
        int res[] = new int[resList.size()];
        for(int i : resList)
            res[index++] = i;
        return res;
    }
}

 Leetcode202:快乐数

题目链接:https://leetcode.cn/problems/happy-number/description/

Hash数组在循环过程中进行存储,循环条件是数值不等于1,存储时如果HashSet存在,则不为快乐数(因为存在会陷入死循环),如果不存在加入此数并进行数值更新计算并进入下一轮判断;

class Solution {
    public boolean isHappy(int n) {
        Set record = new HashSet<>();
        while(n != 1){
            if(record.contains(n)){
                return false;
            }else{
                record.add(n);
            }
            n = getNextValue(n);
        }
        return true;
    }

    purivate int getNextValue(int n){
        int sum = 0;
        while(n != 0){
           sum += Math.pow(n%10,2); 
           n /= 10;
        }
        return sum;
    }
}

 Leetcode1:两数之和

题目链接:

分析:哈希法的使用

  • 需求1.我们需要遍历一个元素时,需要查找target-nums[i] 是否过去遍历过
  • 需求2.如果找到,我们也需要得到对应的下表;所以用键值对形式存放最为合适;
  • 使用HashMap   Key:nums[i] ,value : i;(因为是找对应的元素是否遍历出现过)

Java代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        HashMap record = new HashMap<>();
        for(int i =0;i

总结:哈希

  1. 哈希表适用于:给你一个元素,判断是否在集合内出现过
  2. map形式适合键值对;
  3. set: (a)数值大的时候适用   (b)数据少但是非常分散
  4. 数组 数值小的时候适用

你可能感兴趣的:(散列表,数据结构,哈希算法,leetcode,java,算法,学习)