Leetcode刷题Day5休息 & Day6----------哈希表

Leetcode刷题Day5休息 & Day6----------哈希表

1. 哈希表理论基础

数组、Set、Map
如果数据量小------------数组
如果数据量大------------Set
如果有Key、value------------Map

  • 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

2. 有效的字母异位词 (242)

  • 题目链接:https://leetcode.cn/problems/valid-anagram/
  • 文章讲解: https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html
  • 视频讲解:https://www.bilibili.com/video/BV1YG411p7BA/?vd_source=1fb98c05c7fbfd06713f014ea5079d5b

思路

  1. 分别统计两个字符串每个字母出现的次数,看是否相同。
  2. 数据量小---------使用数组
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] ints=new int[26];
        for(int i=0;i<s.length();i++){
            ints[s.charAt(i)-'a']++;
        }
        for(int i=0;i<t.length();i++){
            ints[t.charAt(i)-'a']--;
        }
        for(int i=0;i<ints.length;i++){
            if(ints[i]!=0) return false;
        }
        return true;
    }
}

3. 两个数组的交集 (349)

  • 题目链接: https://leetcode.cn/problems/intersection-of-two-arrays/
  • 文章讲解/视频讲解:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html

思路

  1. 用把第一个数组的数据加到Set1里 在Set1里查是否有数组2的元素,把有的数据在放到Set2里(避免重复) 将Set2转成数组
  2. set2.stream().mapToInt(x -> x).toArray();
    Javadoc链接:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set=new HashSet<>();
        Set<Integer> set2=new HashSet<>();
        int[] ints=new int[Math.max(nums2.length,nums1.length)];

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

4. 快乐数 (202)

  • 题目链接: https://leetcode.cn/problems/happy-number/
  • 文章讲解:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html

思路

  • 循环说明了要用Set,看是否存在
  • while循环终止的条件:n==1 或者n成为了循环数,所以在循环外判断是否等于1来判断是否是快乐数。因为存在一种成为循环数了但不是1的情况,输入2:循环数是4。例如:
    Leetcode刷题Day5休息 & Day6----------哈希表_第1张图片
  • 数字运算:有多位数的可能,例如:100,所以判断是否>0,先得余,再得商
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set=new HashSet<>();
        while(n!=1&&!set.contains(n)){
            set.add(n);
            n=getNum(n);
        } 
        return n==1;   
    }

    public int getNum(int n){
        int res=0;
        while(n>0){
            res+=(n%10)*(n%10);
            n=n/10;
        }
        System.out.println(res);
        return res;
    }
}

5. 两数之和 (1)

  • 题目链接: https://leetcode.cn/problems/two-sum/
  • 文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int num=target-nums[i];
            if(!map.containsKey(num)){
                map.put(nums[i],i);
            }else 
                return new int[]{i,map.get(num)};
        }
        return new int[0];    
    }
}

你可能感兴趣的:(Leetcode,leetcode,散列表,算法)