• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
li-keke
博客园    首页    新随笔    联系   管理    订阅  订阅
代码随想录算法训练营第六天| 242.有效的字母异位词,349. 两个数组的交集 ,202. 快乐数,1. 两数之和

哈希表:用来快速判断一个元素是否出现在集合里


 

哈希表是根据关键码的值而直接进行访问的数据结构。(关键码也就是数组的下标,元素通过计算生成一个标识,此标识就是数组的下标,之后通过数组的下标对元素进行查找。)


 

 哈希碰撞:就是值两个及两个以上的元素通过计算,生成的关键码(下标)一样,这种现象就是哈希碰撞。

解决哈希碰撞的方法:

  1.拉链法:将发生冲突的元素存储在链表中,类似于hashMap。(选择合适的数组大小,才不会造成空间浪费)

  2.线性探测法:tableSize > dataSize;如遇到第二个下标相同的元素,则在第一个元素后面寻找空位存放。


常见的三种hash数据结构:

1.数组

2.set

3.map

 


 

242.有效的字母异位词:https://leetcode.cn/problems/valid-anagram/

使用一个长度为26的数组来记录每个字母出现的次数,数组的下标标识字母该放的位置,字符串s的字母出现一次+1;字符串t的字母出现一次-1;最后判断数组中有没有不为0的,不为0则说明两个字符串并不相等。

public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isAnagram("anagram","nagaram"));
    }
    public boolean isAnagram(String s, String t) {
        int[] res = new int[26];
        char[] sa = s.toCharArray();
        char[] tc = t.toCharArray();

        for (char c : sa) {
            res[c - 'a'] += 1;
        }
        for (char c : tc) {
            res[c - 'a'] -= 1;
        }
        for (int r : res) {
            if (r != 0){
                return false;
            }
        }
        return true;
    }
}

349.两个数组的交集:https://leetcode.cn/problems/intersection-of-two-arrays/

求并集、交集,就可以使用到set集合,HashSet中不允许出现重复的值

public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0){
            return null;
        }
        HashSet<Integer> set1 = new HashSet<>();
        HashSet<Integer> set2 = new HashSet<>();

        for (int i : nums1) {
            set1.add(i);
        }
        for (int i : nums2) {
            if (set1.contains(i)){
                set2.add(i);   //确保元素唯一
            }
        }
        //set集合转化为数组
        int[] res = new int[set2.size()];
        int index = 0;
        for (Integer integer : set2) {
            res[index++] = integer;
        }
        return res;
    }

202.快乐数:https://leetcode.cn/problems/happy-number/

无限循环说明求和过程中可能会出现重复的数值,应该立即返回false;判断重复值就应该使用set集合。

public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (n !=1 && !set.contains(n)){
            set.add(n);
            n = getSum(n);
        }
        return n == 1;
    }

    public static int getSum(int n){
        int sum = 0 ;
        while (n > 0) {
            int a = n % 10;
            sum += a*a;
            n /= 10;
        }
        return sum;
    }

1.两数之和:https://leetcode.cn/problems/two-sum/

  1.  使用哈希表:当需要查询一个元素是否重复出现过,首先考虑哈希表
  2. 使用map:需要返回下标,元素值和下标都可以储存
  3. map的key和value分别是什么:key存元素值,value存下标
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] ints = solution.twoSum(new int[]{2, 7, 11, 15}, 9);
        for (int anInt : ints) {
            System.out.print(anInt+" ");
        }
    }
    public int[] twoSum(int[] nums, int target) {
        int[] ints = new int[2];
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
           //target-nums[i]的差来判断在map中是否存在,取出下标
            int temp = target - nums[i];
            if (map.containsKey(temp)){
                ints[0] = map.get(temp);
                ints[1] = i;
            }
            map.put(nums[i],i );
        }
        return ints;
    }
}

 

posted on 2022-11-01 23:09  李晓喵  阅读(22)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3