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

242.有效的字母异位词

参考视频和详解

代码随想录

遇到哈希问题的三种数据结构:数组,set, map

  • 数组:size较小,范围可控
  • set:数值很大
  • map:有键值对

优解思路

  1. 定义一个size26的数组a[0], z[25]
  2. 统计第一个字符串里,每一个字符出现的频率,进行++。再统计第二个字符串里,每一个字符出现的频率,进行--
  3. 如果哈希数组最后的每一个元素不为0,说明就不是anagram

时间/空间复杂度 

  • 时间复杂度: O(n)
  • 空间复杂度: O(1): 空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)

遇到的问题

  1. java语言不熟练,比如:
  • string求size:s.length(), 而不是s.length
  • 数组求size: array.length,而不是array.length()
  • 求字符串在index处的字符:s.charAt(i),而不是s[i]
  •  字符的表示:'a',而不是“a”

349. 两个数组的交集

参考视频和详解

代码随想录

优解思路

unordered set

  1. 把num1的数值放到哈希表(去重num1)
  2. 遍历num2,查看哈希表里有没有num2的元素(找交集)
  3. 有交点,把元素放到result集合里

时间/空间复杂度

  • 时间复杂度: O(n + m) m 是最后要把 set转成数组
  • 空间复杂度: O(n)

遇到的问题

set的基本语法和function不熟悉

1. 如何定义一个新set

Set<Integer> set1 = new HashSet<>();

2. set的方法

  • 添加元素:set.add(element)
  • 查看是否包含某元素:set.contains(element)

3. 数组求长度和字符串求长度混淆

int arrSize = arr.length

int strSize = str.length()

4. 如何将set转成数组?

        int[] result = new int[resSet.size()];

        int i = 0;

        for(int element: resSet){

            result[i] = element;

            i++;

        }

        return result;

总结

1. 什么时候用哈希表?

给你一个元素,判断这个元素在集合里是否出现过

2. 为什么不能用数组

因为用数组的话,数值是有限制的,没有限制数值大小的时候不能用

3. 什么时候用set

  • 数组的数值没有限制
  • 哈希值比较少,很分散且跨度非常大

4. set的分类 

什么时候用HashSet, 什么时候用TreeSet, 什么时候用LinkedHashSet?

https://chat.openai.com/share/eff821fb-dd8c-4c39-b125-213fbb08c23a

202. 快乐数

参考视频和详解

代码随想录

优解思路

和349两数组交点是同一个类型

时间/空间复杂度

(这里没理解

  • 时间复杂度: O(log n)
  • 空间复杂度: O(log n)

遇到的问题

1. 想不到用set的数据结构

题目说会无限循环,也就是说sum会重复出现,只要判断有重复元素就返回false

2. 不会对每个位数上的数值进行取数

先取模再相除

private int getSum(int n){

        int sum = 0;

        while(n != 0){

            int num = n % 10; //求位数上的数

            sum += num * num; //求和

            n = n / 10; //取下一位的数

        }

        return sum;

    }

1. 两数之和 

参考视频和详解

代码随想录

优解思路

哈希表

hashMap的作用:把已经遍历过的元素存放起来

时间/空间复杂度

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

遇到的问题

1. Map基本语法和方法不熟悉

  • 新建一个map需要两个参数:

Map<Integer, Integer> resMap = new HashMap<>();

  • 增加元素:

map.put(key: num1, val: num2)

  • 是否包含某元素:

map.containsKey()

  • 根据key查找val:

⚠️注意不能根据val查找key,因为val是可以重复的

所以这里只能是key=nums[i], val = i (这里做题的时候颠倒了

map.get(key)

2. 思考逻辑错误

新建一个hashMap的目的不是把数组转成map, 而是把已经遍历过的元素用hashMap存放起来

我的解法是把数组转换成hashMap,也就是把数组里所有的元素存到hashMap里,这样做的逻辑漏洞是:当数组只有两个相同的元素,比如[3, 3],target=6时,第二个元素3是存不进hashMap的,因为map的key不能重复。那么hashmap就只有一个数3,永远找不到与其相加等于target的值。

3. 数据结构选用错误

这道题为什么不用set而是用map?

因为要根据value找index,说明存储方式是键值对

总结

1. 哈希表什么时候用?

当要判断这个元素是否出现过,或判断元素是否在集合里

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值