当前位置:   article > 正文

代码随想录算法训练营(JAVA) | 第三章 哈希表part01 DAY05

代码随想录算法训练营(JAVA) | 第三章 哈希表part01 DAY05

   今日任务 

力扣242. 有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和

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

 什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

242. 有效的字母异位词

思路

由于字符串只包含 26个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次

题解
  1. class Solution {
  2. public boolean isAnagram(String s, String t) {
  3. if (s.length() != t.length()) {
  4. return false;
  5. }
  6. int[] hashTable = new int[26];
  7. for (int i = 0; i < s.length(); i ++ ) {
  8. hashTable[s.charAt(i) - 'a']++;
  9. }
  10. for (int i = 0; i < t.length(); i ++ ) {
  11. hashTable[t.charAt(i) - 'a']--;
  12. if (hashTable[t.charAt(i) - 'a'] < 0) {
  13. return false;
  14. }
  15. }
  16. return true;
  17. }
  18. }

349. 两个数组的交集

思路

苦于 基础不牢语法不熟现去看了看基础依照思路写出来了

老是忘条件处理

题解
1.使用HashSet
  1. class Solution {
  2. public int[] intersection(int[] nums1, int[] nums2) {
  3. if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
  4. return new int[0];
  5. }
  6. Set<Integer> set1 = new HashSet<>();
  7. Set<Integer> setList = new HashSet<>();
  8. for (int i : nums1) {
  9. set1.add(i);
  10. }
  11. for (int i : nums2) {
  12. if(set1.contains(i)) {
  13. setList.add(i);
  14. }
  15. }
  16. // 方法一: 将结果集合转化为数组
  17. // return setList.stream().mapToInt(x -> x).toArray();
  18. // 方法二: 创建一个新的数组存放setList中的值并返回
  19. int[] arr = new int[setList.size()];
  20. int flag = 0;
  21. for (int i : setList) {
  22. arr[flag++] = i;
  23. }
  24. return arr;
  25. }
  26. }
2.使用哈希数组
  1. class Solution {
  2. public int[] intersection(int[] nums1, int[] nums2) {
  3. int[] hash1 = new int[1010];
  4. int[] hash2 = new int[1010];
  5. List<Integer> resList = new ArrayList<>();
  6. for (int i : nums1) {
  7. hash1[i] ++;
  8. }
  9. for (int i : nums2) {
  10. hash2[i]++;
  11. }
  12. for (int i = 0; i < 1010; i ++) {
  13. if (hash1[i] > 0 && hash2[i] > 0) {
  14. resList.add(i);
  15. }
  16. }
  17. int index = 0;
  18. int[] res = new int[resList.size()];
  19. for (int i : resList) {
  20. res[index++] = i;
  21. }
  22. return res;
  23. }
  24. }

202. 快乐数

思路

第一遍读题 emmmm没想法,看一眼提示   /思考  要存 set 也就是说这道题有重复的内容咯,每位数的平方和会重复!那也就是说会陷入循环,也就是说只要有重复内容就不是快乐数

题解
  1. class Solution {
  2. public boolean isHappy(int n) {
  3. Set<Integer> set = new HashSet<>();
  4. while (n != 1 && !set.contains(n)) {
  5. set.add(n);
  6. n = getNext(n);
  7. }
  8. if (n == 1) {
  9. return true;
  10. }
  11. return false;
  12. }
  13. private int getNext(int n) {
  14. int sum = 0;
  15. while (n > 0) {
  16. int tmp = n % 10;
  17. sum += tmp * tmp;
  18. n /= 10;
  19. }
  20. return sum;
  21. }
  22. }

1. 两数之和

思路

正如提示说的要用map KV,为什么用map呢?因为 要存 数值  和 下标 这两个值

题解 
  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. int[] res = new int[2];
  4. Map<Integer, Integer> map = new HashMap<>();
  5. if (nums == null || nums.length == 0) {
  6. return res;
  7. }
  8. for (int i = 0; i < nums.length; i++ ) {
  9. int tmp = target - nums[i];
  10. if (map.containsKey(tmp)) {
  11. res[0] = map.get(tmp);
  12. res[1] = i;
  13. break;
  14. }
  15. map.put(nums[i], i);
  16. }
  17. return res;
  18. }
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/182836
推荐阅读
相关标签
  

闽ICP备14008679号