Day 5 - Leetcode 242有效的字母异位词 | Leetcode 349两个数组的交集 | Leetcode 202快乐数 | Leetcode 1两数和

哈希表 hash table

  • 一般用来快速判断一个元素是否出现集合里
  • 查找元素时间复杂度O(1)

哈希函数 hash function
哈希碰撞 hash collision

  • 线性探测法
  • 拉链法

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

leetcode242

题目链接
经典题

思路:

  • 开辟一个长度26的数组flag[]
  • flag[s.charAt(i) - 'a']
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] flag = new int[26];
        for (int i = 0; i < s.length(); ++i)
            ++flag[s.charAt(i) - 'a'];

        for (int i = 0; i < t.length(); ++i)
            --flag[t.charAt(i) - 'a'];

        for (int i = 0; i < 26; ++i) {
            if (flag[i] != 0)
                return false;
        }
        return true;
    }
}

leetcode 349

题目链接

tips:
使用数组做hash的题目——题目都限制了数值的大小
本题未规定数值范围,因此不行

  • set解决

java中集合使用

  • 函数:
    • add():添加元素
    • contains():是否包含某个元素
    • remove():删除元素
    • size():返回元素数
    • isEmpty():是否为空
    • clear():清空

java.util.TreeSet多的函数*——支持二分查找*

  • ceiling(key):返回大于等于key的最小元素,不存在则返回null
  • floor(key):返回小于等于key的最大元素,不存在则返回null

代码

import java.util.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];

        Set<Integer> s1 = new HashSet<Integer>();
        Set<Integer> s2 = new HashSet<>();
        for (int x: nums1)
            s1.add(x);

        for (int x : nums2) {
            if (s1.contains(x))     //find whether nums2[i] in s1
                s2.add(x);
        }

        int[] res = new int[s2.size()];
        int i = 0;
        for (int x : s2) {
            res[i++] = x;
        }
        return res;
    }
}

leetcode 202

题目链接
看起来像是数学问题,but 其实是一个集合问题

import java.util.HashSet;
class Solution {
    public int getNum(int n) {
        int num = 0;
        while (n > 0) {
            int t = n % 10;     //末位数
            num += t * t;
            n = n / 10;
        }
        return num;
    }
    public boolean isHappy(int n) {
        Set<Integer> res = new HashSet<>();

        while (!res.contains(n) && n != 1) {
            res.add(n);
            n = getNum(n);      //find next number
        }
        if (n == 1)
            return true;
        else
            return false;
    }
}

leetcode 1

题目链接

重点!! 想到使用hash table Map 解决

java中Map使用

  • 实现:

    • java.util.HashMap<K, V>:哈希表——无序
    • java.util.TreeMap<K, V>:平衡树——有序
  • 函数:

    • put(key, value):添加关键字和其对应的值
    • get(key):返回关键字对应的值
    • containsKey(key):是否包含关键字
    • remove(key):删除关键字
    • size():返回元素数
    • isEmpty():是否为空
    • clear():清空
    • entrySet():获取Map中的所有对象的集合
    • Map.Entry<K, V>:Map中的对象类型
    • getKey():获取关键字
    • getValue():获取值

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if (nums.length == 0)
            return res;
        
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; ++i) {
            int t = target - nums[i];
            if(map.containsKey(t)){     //Map <key, value>
                res[1] = i;
                res[0] = map.get(t);
                break;
            }
            map.put(nums[i], i);    // 如果没找到匹配对,就把访问过的元素和下标加入到map中
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值