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

目录

题目链接:242. 有效的字母异位词 - 力扣(LeetCode)

作者思考:

 题目链接:349. 两个数组的交集 - 力扣(LeetCode)

作者思考:

题目链接:202. 快乐数 - 力扣(LeetCode)

作者思考:

题目链接:1. 两数之和 - 力扣(LeetCode)

作者思考:


题目链接:242. 有效的字母异位词 - 力扣(LeetCode)

作者思考:

这种查找是否包含相同字符的,可以用两层for循环暴力遍历出结果,可是时间复杂度太高了,在LeetCode上很有可能过不去。那有没有简单方法呢?哈希表。那哈希表能解决什么问题呢?哈希表一般用来快速判断一个元素是否出现在集合中。这时考虑用哈希表。

本道题是需要我们判断两个字符串是否为字母异位词。那也就是说我们可以定义一个哈希表用于存储26个字母,然后统计每个索引值出现的次数,即可求出结果;那么选择哪一个哈希表呢?因为我们需要存储的数据量很小,且需要经常性的查询,故我们选择数组。

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];//定义一个长度为26的数组存放字符
        
        for (int i = 0; i < s.length(); i++) {
            record[s.charAt(i) - 'a']++;//读取字符串中的字符 - 'a'刚好是字符的索引 ,并记录出现的个数
        }

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

        for (int count : record) {
            if (count != 0) {
                return false;
            }
        }
        return true;
    }
}

 题目链接:349. 两个数组的交集 - 力扣(LeetCode)

作者思考:

根据题目要求 核心是:输出结果中的每个元素一定是惟一的。唯一值,我们可以考虑set集合,set集合可以帮助我们去重

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return new int[0];
        }//判断 数组是否为空 再判断是否长度为0
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();
         for (int i : nums1 ) {
             set1.add(i);//set1 包含的元素是nums1去重后的元素
         }
         for (int i : nums2) {
             if (set1.contains(i)) {
                 resSet.add(i);//将重复的元素记录到集合中
             }
         }

         //定义一个数组来接收集合中的元素
         int[] arr = new int[resSet.size()];
         int j = 0;
         for (int i : resSet) {
             arr[j++] = i;
         }
         return arr;
    }
}

题目链接:202. 快乐数 - 力扣(LeetCode)

作者思考:

理清题目后,我们大概可以分成两个难点①:一个数循环拆分各位的平方和 ;②:如何找到这个过程中出现死循环的数,退出这个循环

解决第一个难点,我们只需要再定义一个函数吗,然后在查找快乐数的过程中调用

解决第二个难点,寻找重复出现的数,我们想要数组不出现重复数,可以使用set集合帮助去重

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();//加入set集合的目的是为了去重
        while (n != 1 && !set.contains(n)) {//判断该数字经过循环后是否为1,且集合中有且只有一个该数字
        set.add(n);//满足条件加入集合
        n = getSum(n);
        }
        return n == 1;
    }

    public int getSum(int n) {
        int sum = 0;
        while (n > 0) {
            int tmp = n % 10;//取个位
            n = n / 10;//十位变个位 , 其他位相应右移一位
            sum += tmp * tmp;
        }
        return sum;
    } 
}

题目链接:1. 两数之和 - 力扣(LeetCode)

作者思考:

温馨提示不要晚上看算法会蒙圈hh。

示例 1:

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

 当target = 9时,我们遍历到集合中第一个元素2时,我们可以查找之前遍历过的集合中有没有 和2相加 等于 目标target = 9的元素。按照上述思路,我们需要用一个集合存放之前遍历过的元素,一个用于存放当前的索引。之前set list 集合都是用于存放单个含义的元素。不满足题目的要求,这时我们刚好可以用map集合(key - value)以键值对的形式存储数据,且可以快速查找目标key是否存在map集合中。

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<>();//定义一个map集合 key-元素 value-存放索引
        for (int i = 0; i < nums.length; i++) {
            int s = target - nums[i]; 
            if (map.containsKey(s)) {
                res[0] = map.get(s);//因为是查找之前遍历过的元素 故索引为0
                res[1] = i;
                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、付费专栏及课程。

余额充值