代码随想录算法训练营day6|哈希表

本文介绍了如何通过构建数组和哈希表来判断字符串是否为字母异位词,以及如何找到两个数组的交集。同时,涉及到了数组操作中的空间和时间复杂度优化,以及解决两数之和问题的策略。
摘要由CSDN通过智能技术生成

242.有效的字母异位词

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路

这题对我来说偏简单,因为题目的设置比较巧妙的一点就是它拼凑的字母全是小写字母,那么我们完全可以去构造一个和小写字母同样多的数组来统计两个字符串中字母出现的频度。

我的方法比较笨的一点是我构造了两个数组,这两个数组统计的东西其实一模一样,而且还是统计相不相等的情况下,其实可以通过此消彼长的方法,最后遍历整个数组看是否全为0,这也是一个很好的空间复杂度优化的方式。

代码

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] alp1 = new int[26];
        int[] alp2 = new int[26];
        for(int i = 0;i<26;i++){
            alp1[i]= alp2[i]=0;
        }
        for(int i = 0;i<s.length();i++){
            alp1[s.charAt(i)-'a']++;
        }
        for(int j = 0;j<t.length();j++){
            alp2[t.charAt(j)-'a']++;
        }
        for(int i = 0;i<26;i++){
            if(alp1[i]!=alp2[i]){
                return false;
            }
        }
        return true;
    }
}

349.两个数组的交集

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

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

思路

和上一个的做法很像,不过这里就不能使用此消彼长的关系了,这道题比较难处理的就是结果数组如何确定长度,因为对Java的高级数据结构不太了解,所以这里也是看答案才才知道可以用

代码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] a = new int[1002];
        int[] b = new int[1002];
        for(int i= 0;i<nums1.length;i++){
            a[nums1[i]]++;
        }
        for(int i= 0;i<nums2.length;i++){
            b[nums2[i]]++;
        }

        List<Integer> resList = new ArrayList<>();
        for(int i =0;i<1002;i++){
            if(a[i]>0&&b[i]>0){
                resList.add(i);
            }
        }
        int[] res = new int[resList.size()];
        int index = 0;
        for(int i:resList){
            res[index++] = i;
        }
        return res;

    }
}

1.两数之和

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

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

思路

这题没有思路,确实难,难的地方就在于怎么降低它的时间复杂度,主要要解决四个问题

  • 为什么这题和哈希表有关?我们可以把已经遍历的元素存入哈希表,那么我们遍历到一个元素的时候我们可以寻找这个数和我们目标值的差是否在这个哈希表里面
  • 为什么用map?因为我们需要返回它的下标,也就是值的话需要为map,所以最好用map。
  • 我们用map来存什么?我们用map来存已经遍历过的元素值以及它的下标
  • map中的key和value用来存什么?值和下标

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums == null||nums.length==0){
            return res;
        }
    
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i<nums.length;i++){
            int temp = target - nums[i];
            if(map.containsKey(temp)){
                res[0] = map.get(temp);
                res[1] = i;
                break;
            }
            map.put(nums[i],i);
        }
    return res;
    }
}

202.快乐数

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

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

思路

这个题首先需要知道的是它怎么计算它的最后的和,我们一直在算数字,然后我们会走入一个数字环,这个数字环如果我们想找到相遇的点的话这个相遇点为1,如果相遇点不是1的话就说明它不是快乐数。

代码

class Solution {
    public boolean isHappy(int n) {
        int slow = n;int fast = step(n);
        while(slow!=fast){
            slow = step(slow);
            fast = step(step(fast));
        }
        return slow == 1;
    }

    public int step(int num){
        int ans = 0;
        while(num!=0){
            int x = num%10;
            ans += x*x;
            num = num/10;
        }
        return ans;
    }
}

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值