代码随想录算法训练营第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表理论基础

 

哈希:又称散列,一般用于将一个分散的、杂乱的数据通过某个函数,映射到一个新的数据,而新数据往往更容易处理,比如新数据可能具有统一的长度,或者具有更小的范围,或者更紧凑,或者更方便比较等等,在java中体现为以下API:

HashMap:键不重复,值可重复;允许key和value为空;
HashTable:键不重复,值可重复;不允许key和value为空;
HashSet:排列无序,不可重复;存取速度快;内部为HashMap;

根据哈希算法的思想,最基础的数据结构之一——数组也可用作HashSet或HashMap等。在其它条件相同时,用数组作为哈希表的效率往往会更高。

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

但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!

242. 有效的字母异位词代码随想录算法训练营第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和_第1张图片

给定两个字符串 s和 t,编写一个函数来判断 t是否是 s 的字母异位词。

输入: s = "anagram", t = "nagaram"
输出: true

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] result=new int[26];
        for(int i=0;i
  1. 定义字母的数组,26个字母
  2. 将两个字符串的字母全部遍历到数组当中,一个字符串做++操作,一个字符串做 --操作
  3. 判断数组当中的是否全部为零,全部为零返回true,否则返回false

349. 两个数组的交集

给定两个数组 nums1和 nums2,返回 它们的交集。输出结果中的每个元素一定是 唯一的。我们可以 不考虑输出结果的顺序

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

代码随想录算法训练营第六天 | 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和_第2张图片

 

当两个数组当中存在重复的元素,但是要求输出唯一元素,可以巧用Set值不重复的特性,去消去一个数组当中重复的元素。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //1.判断数组为空的情况
        if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
            return new int[0];
        }
        //2.创建两个空的HashSet,一个用于存储遍历的nums1,一个用来存储结果
        Set numSet=new HashSet<>();
        Set reslut=new HashSet<>();
        //3.将数组nums1添加到num1Set哈希表中
        for(int i:nums1){
            numSet.add(i);
        }
        //4.遍历nums2并判断是否包含在numSet里面,若果包含将i添加到reslut哈希表当中
        for(int i:nums2){
            if(numSet.contains(i)){
                reslut.add(i);
            }
        }
        //5.返回的结果是哈希表,需要转成数组才可
        return reslut.stream().mapToInt(x->x).toArray();

    }
}

哈希表类contains()方法:

contains()方法用于检查是否有任何键映射到给定值元素(val_ele)中 numSet.contains(i)

注意:最后得到的result是哈希表,需要将哈希表转换为int[]数组形式:

reslut.stream().mapToInt(x->x).toArray();

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

这道题的核心来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。所以可以提前定义一个函数进行求和的操作,然后while循环里面一只调用。

class Solution {
    public boolean isHappy(int n) {
        Set reslut=new HashSet<>();
        while(n!=1&&!reslut.contains(n)){
            reslut.add(n);
            n=getSum(n);
        }
        return n==1;
    }
//求和
    public int getSum(int n){
        int sum=0;
        while(n>0){
            sum+=(n%10)*(n%10);
            n=n/10;
        }
        return sum;
    }
}

这里的循环条件是while(n!=1&&!reslut.contains(n))

n!=1是为了保证输入的不是快乐数,否则不需要判断

!reslut.contains(n) 判断哈希表中是否重复出现了计算玩的n否则,就会重复循环(即这个数不可能是快乐数,可以直接返回,避免死循环)

1. 两数之和

给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

这道题不仅要求找到值,还要求返回数组下表,所以需要使用hashmap

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map map=new HashMap<>();
        int[] New=new int[2];
        if(nums==null||nums.length==0){
            return New;
        }
        for(int i=0;i

Java HashMap containsKey() 方法

containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。

containsKey() 方法的语法为:hashmap.containsKey(Object key)

今日小结:

  1. 哈希表的应用情况:要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
  2. 要求返回结果不重复,并且只需要获取值时可以使用HashSet
  3. 要求返回结果既要考虑到值又要考虑到索引时,需要考虑HashMap的键值对映射

你可能感兴趣的:(算法,leetcode,数据结构)