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

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

242.有效的字母异位词

题目链接

问题简述:判断两个字符串s和t里字母是不是种类个数相同,只是顺序不同。

思考:之前没学过hashmap,看了视频学会了用数组表示,注意创建数组时默认值全为0;然后数字是直接可以直接-‘a’,这样代表了数字直接减去a的ascii码。hashmap一般情况用到三种数据结构:

  • 数组:处理无需键值对的数据量较小的数据,且数据不是很离散。
  • set:处理无需键值对的数据量较大的数据,数据可以很离散。
  • map:处理需要有键值对的数据。

算法思路:用数组的0~25分别存储s中小写字母a~z出现的次数,再减去t中小写字母出现次数,最后查看数组是否全为0。

时间复杂度 :O(n)

空间复杂度 :O(1)

class Solution {
    public boolean isAnagram(String s, String t) {
        int hash[] = new int[26];
      //记录字母出现次数
        for (int i = 0; i < s.length(); i++) {
            hash[(int)s.charAt(i) - 'a']++;
        }
      //剪去t中字母出现次数
        for (int i = 0; i < t.length(); i++) {
            hash[(int)t.charAt(i) - 'a']--;
        }
      //判断是否全为0
        for (int i = 0; i < 26; i++) {
            if(hash[i] != 0) return false;
        }
        return true;
    }
}

349. 两个数组的交集

题目链接

问题简述:求两个数组的交集存入数组,且输出数组元素不能重复。

思考:这道题用到了set,常用的操作是set.add();加入元素;set.contains();查询元素是否存在;set.remove;将元素移除。这三个操作时间复杂度都为O(1)。同时这道题因为要返回一个数组,因为开始不知道数组长度,而且为了避免重复,所有先将交集元素存入了一个新的set2,再遍历set2到数组中,注意int i : set2在循环内的i指的是元素本身而不是元素的索引,对于数组仍然成立。

算法思路:将nums1存入set,再依次判断nums2元素是否在其中,如果在的话将元素存入set2,最后将set2元素存入数组。

时间复杂度: O(n)

空间复杂度: O(n + m) //m为set存入数组

import java.util.HashSet;

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 创建一个 HashSet
        HashSet<Integer> set = new HashSet<>();
        HashSet<Integer> set2 = new HashSet<>();
      //将num1存入set
        for (int i : nums1) {
            set.add(i);
        }
      //判断nums2元素是否在set中,如果在存入set2
        for (int i : nums2){
            if(set.contains(i)){
                set2.add(i);
            }
        }
        int[] a = new int[set2.size()];
        int j = 0;
      //将set2存入数组
        for(int i : set2){
            a[j++] = i;
        }
        return a;
    }
}

202. 快乐数

题目链接

问题简述:判断一个数是否为快乐数,快乐数指在有限次数内,不断将其各个位数字平方加和最后成为1的数。

思考:对set的再次运用,如果不为快乐数,则数字会一直循环。一般我们要判断一个及格是否存在某个元素,考虑用set来解决。

算法思路:求出两条链表的长度,将更长的链表先遍历两链表长度差值次,再同时遍历两个链表,直到找到公共节点。

时间复杂度 O(logn)

空间复杂度 O(logn)

import java.util.HashSet;

class Solution {
  //判断这个新数字是否存在过,并不断把新数字添加到set,存在过就结束返回false,不存在就继续循环直到出现1为止
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (!set.contains(n)){
            set.add(n);
            n = sum(n);
            if (n == 1) return true;
        }
        return false;
    }
  //求一个数各个位数字平方加
    public int sum(int n){
        int sum = 0;
        while (n != 0){
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        System.out.println(sum);
        return sum;
    }
}

1. 两数之和

题目链接

问题简述:找出数组中两数之和为target的两个元素下标,存入一个两个元素的数组中。

思考:这道题用到了map,今天只是先把这些怎么用弄明白了,并没有完全搞懂底层的链表、红黑树之类的,二刷再看。map常用方法:

//定义并存入键值对
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
//获取值value
int value = map.get("apple");
//判断是否含指定的键
map.containsKey("apple")

算法思路:遍历数组,同时判断map是否存在为target - nums[i]的键。若不存在,将当前数组数字和下标存入键值对,若存在即找到了两个加和为target的数字,分别将当前i和对应键值对的值存入数组,返回数组。

时间复杂度 O(n)

空间复杂度 O(n)

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        int[] arr = new int[2];
        for (int i = 0; i < nums.length; i++) {
          //如果存在对应值,则找到两个数字的下标
            if(map.containsKey(target - nums[i])){
                arr[0] = i;
                arr[1] = map.get(target - nums[i]);
                break;
            }
          //如果目前还不存在,则把数组元素和下表存入map
            map.put(nums[i], i);
        }
        return arr;
    }
}


感想

hash是第一次接触,完全没有之前数组和链表顺利,继续加油!

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值