当前位置: 首页 > news >正文

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

 哈希表理论基础 

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。  

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。 

文章讲解:代码随想录

 242.有效的字母异位词 

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 

题目链接/文章讲解/视频讲解: 代码随想录

 349. 两个数组的交集 

建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 

题目链接/文章讲解/视频讲解:代码随想录

 202. 快乐数 

建议:这道题目也是set的应用,其实和上一题差不多,就是 套在快乐数一个壳子 

题目链接/文章讲解:代码随想录

 1. 两数之和 

建议:本题虽然是 力扣第一题,但是还是挺难的,也是 代码随想录中 数组,set之后,使用map解决哈希问题的第一题。 

建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。 

题目链接/文章讲解/视频讲解:代码随想录


        使用哈希法,用数组来做哈希表。字符为key,建立key与index的映射,然后value为key出现的次数。

映射关系index=key-‘a’。

c++代码示例如下时间复杂度O(n)、空间复杂度O(1)

bool isAnagram(string s, string t) {int record[26] = { 0 };for (int i = 0; i < s.size(); i++) {record[s[i] - 'a']++;}for (int i = 0; i < t.size(); i++) {record[t[i] - 'a']--;}for (int i = 0; i < 26; i++) {if (record[i] != 0) {return false;}}return true;
}

        输出结果中每一个元素都是唯一的,我们使用unordered_set来接受结果,对于unordered_set的初始化可以使用迭代器初始化。

c++代码示例如下        时间复杂度O(n+m),空间复杂度O(n)

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;unordered_set<int> nums_set(nums1.begin(), nums1.end());for (int num : nums2) {if (nums_set.find(num) != nums_set.end()) {result.insert(num);}}return vector<int>(result.begin(), result.end());
}

        发现题目给的数据的大小0<=nums1[i],nums2[i]<=1000,可以使用大小为1001的数组来做哈希表,数字作为key->index,出现次数为value。还是用unordered_set来接受结果。

c++代码示例如下

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;int hash[1001] = { 0 };for (int num : nums1) {hash[num] = 1;}for (int num : nums2) {if (hash[num] == 1) {result.insert(num);}}return vector<int>(result.begin(), result.end());
}

        难点就是意识到无限循环就是sum重复出现

c++代码示例如下

int getSum(int n) {int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}
bool isHappy(int n) {unordered_set<int> set;while (1) {int sum = getSum(n);if (sum == 1) {return true;}if (set.find(sum) != set.end()) {return false;}else {set.insert(sum);}n = sum;}
}
http://www.lryc.cn/news/273397.html

相关文章:

  • 2024.1.4每日一题
  • C++协程和线程的区别?详细介绍一下C++协程
  • 数字信号处理期末复习——计算大题(一)
  • matlab数值计算函数--ode45
  • Vue3地图选点组件
  • JS之注册事件兼容性解决方案
  • C#中使用as关键字将对象转换为指定类型
  • 【Spring实战】21 Spring Data REST 常用功能详细介绍
  • 05-微服务-RabbitMQ-概述
  • jmeter参数化的三种方式
  • java基础之Java8新特性-Lambda
  • 入门使用mybatis-plus
  • ubuntu安装和配置ssh教程
  • 每天刷两道题——第六天
  • 时间序列平稳性相关检验方法
  • <leetcode修炼>双指针训练-移动零
  • Python初探:从零开始的编程奇妙之旅
  • 算法与数据结构之链表<一>(Java)
  • 目标检测COCO数据集与评价体系mAP
  • 2024最全面且有知识深度的web3开发工具、web3学习项目资源平台
  • Golang - defer关键字 深入剖析
  • 如何在Spring Boot中使用@Scheduled写定时任务判断数据量是否过大,过大则进行分表操作,多张表使用临时视图查询
  • 使用jieba库进行中文分词和去除停用词
  • C语言之分支与循环【附6个练习】
  • 使用通用MCU实现无人机飞行任务的快速二次开发
  • 什么是Selinux
  • 计算机网络知识点
  • Qt 连接 Mysql
  • HarmonyOS4.0系统性深入开发14AbilityStage组件容器
  • 客服系统接入FastGPT