【代码随想录】刷题Day6

news/2025/2/21 8:06:16/

1.有效异位词

242. 有效的字母异位词

直接使用库函数的multiset来判断

其实没什么好说的,因为字符串有重复的可以出现所以用的multiset

缺点:确实浪费空间,红黑树的插入删除,浪费时间

class Solution {
public:bool isAnagram(string s, string t) {multiset<char> ms;multiset<char> mt;for (auto e : s)ms.insert(e);for (auto e : t)mt.insert(e);if (ms.size() != mt.size())return false;auto begin1 = ms.begin();auto begin2 = mt.begin();while (begin1 != ms.end()){if (*begin1 != *begin2)return false;begin1++;begin2++;}return true;}
};

2.数组实现

26个小写字母,而且是连续的,那么我们直接用数组来存储也可以的

1.那么映射的方式也很简单了,a就对应下标0,z对应下标25

2.第一个string里的字符对应下标元素有则加一;第二个是减一

3.到这里说明两个string都应该映射过了,那么我们检查hash是不是已经全为空,如果不是失败;反之成功

class Solution {
public:bool isAnagram(string s, string t) {int hash[26]={0};for(auto e:s)hash[e-'a']++;for(auto e:t)hash[e-'a']--;for(int i=0;i<26;i++){if(hash[i]!=0)return false;}return true;}
};

2.数组交集

​​​​​​349. 两个数组的交集

用unordered_set去重,用unordered_map计数

1.unordered_set插入所有元素,不重复出现

2.unordered_map把两个unordered_set中的东西判断一下,遍历如果是1的就是交集

缺点:简单问题复杂化了

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;unordered_set<int> s1;unordered_set<int> s2;unordered_map<int,int> m;for(auto& e:nums1)s1.insert(e);for(auto& e:nums2)s2.insert(e); for(auto& e:s1)m[e]++;for(auto& e:s2)m[e]++; for(auto& e:m){if(e.second==2)ret.push_back(e.first);}return ret;}
};

优化过的

1.ret_set用来存储两个的交集

2.num_set存储nums1的所有元素

3.遍历一遍nums2,在num_set中能找到的说明是交集要插入ret_set,ret_set能去重

4.返回ret_set里的元素就行了

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> ret_set;unordered_set<int> num_set(nums1.begin(),nums1.end());for(auto e:nums2){if(num_set.find(e)!=num_set.end())ret_set.insert(e);}vector<int> ret(ret_set.begin(),ret_set.end());return ret;}
};

数组实现

由于其数据个数范围在1~1000,因此我们通过数组实现也可以

unordered_set的缺点是哈希冲突会调用内部函数调整,这也减少了效率

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> ret_set;int hash[1001]={0};for(auto e:nums1)hash[e]=1;for(auto e:nums2){if(hash[e]==1)ret_set.insert(e);}vector<int> ret(ret_set.begin(),ret_set.end());return ret;}
};

3.快乐数

​​​​​​202. 快乐数

一个数拆开平方相加其实很好写,重要的是怎么判断重复了。因此哈希表是一个很好的查重

1.先定义一个unordered_set,并且插入n

2.n没到1或者没有重复都要不停循环,那么我们结束循环条件就是n为1

3.定义一个临时遍历sum,它用来算n拆开后的平方的总和,再把n变成sum

4.这下就要看n有没有重复,重复则返回false;没有则依然循环

5.结束循环说明n为1,那么就返回true

class Solution {
public:bool isHappy(int n) {unordered_set<int> us;us.insert(n);while(n!=1){int sum = 0;while(n){sum+=(n%10)*(n%10);n/=10;}n=sum;if(us.find(n)==us.end())us.insert(n);elsereturn false;}return true;}
};

4.两数之和

​​​​​​1. 两数之和

暴力求法

两层循环就行了

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {for(int i=0;i<nums.size();i++){for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]==target)return {i,j};}}return {};}
};

洋洋洒洒写完后,看就这么几个字

"你可以想出一个时间复杂度小于 O(n^2) 的算法吗?" -- 要求反而是一种提示。

哈希表

1.回顾一下我们要干什么,我们要上两个数加起来等于目标的

2.那么我们如果已经知道一堆数加起来一定不能等于目标,下一个加进来的,能不能利用已知前面的特性去专门找有没有符合的呢?两层暴力循环意味着我们没有利用起来已经遍历过的数,所以哥们觉得这也可以优化

3.遍历一个数,我们先将target减去这个数,看看表里有没有,没有就插入这个表;有的话就结束了。优化到时间复杂度为O(N)啊!

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> um;int num = 0;for(auto e:nums){if(um.find(target-e)==um.end())um.insert(make_pair(e,num++));elsereturn {um.find(target-e)->second,num++};}return {};}
};


http://www.ppmy.cn/news/55176.html

相关文章

WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量

查看原文>>>高精度气象模拟软件WRF(Weather Research Forecasting)技术及案例应用 目录 区域气候模式理论知识梳理 Linux操作系统WRF模式系统实际操作 模式调试及运行 模式操作及案例实践 实际应用及案例分析 Python在WRF模型自动化运行及前后处理中的实践技术…

Steam-V Rising 私人服务器架设教程

一、安装前的准备 一台服务器 拥有公网IP并且做好了端口映射 二、使用SteamCMD安装服务器 1.下载SteamCMD SteamCMD是Steam专用的命令行式客户端程序&#xff0c;所有的安装方式可以参照&#xff1a;https://developer.valvesoftware.com/wiki/SteamCMD 或者在其他站点自行…

Midjourney以图生图的详细教程(含6种案例介绍)

&#x1f3c6; 文章目标&#xff1a;学习并介绍Midjourney以图生图的详细教程 &#x1f340; Midjourney以图生图的详细教程 ✅ 创作者&#xff1a;熊猫Jay &#x1f389; 个人主页&#xff1a;Jay的个人主页 &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c…

15个使用率超高的Python库,下载量均过亿

今天给大家分享最近一年内PyPI上下载量最高的Python包。现在我们来看看这些包的作用&#xff0c;他们之间的关系&#xff0c;以及为什么如此流行。 1. Urllib3&#xff1a;8.93亿次下载 Urllib3 是 Python 的 HTTP 客户端&#xff0c;它提供了许多 Python 标准库没有的功能。 …

Ajax和Json综合案例

1. 查询所有 创建brand.html,使用axios发送请求&#xff0c;其中查询一般采用get的请求方式 <script src"js/axios-0.18.0.js"></script><script>//1. 当页面加载完成后&#xff0c;发送ajax请求window.onload function () {//2. 发送ajax请求axi…

一篇简单的文章带你玩转SpringBoot 之定时任务详解

序言 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要有以下三种创建方式&#xff1a; 一、基于注解(Scheduled)二、基于接口&#xff08;SchedulingConfigurer&#xff09; 前者相信大家都很熟悉&#xff0c;但是实际使用中我们往往想从数据库中读取指定时间来动态…

Java——装箱和拆箱

一.装箱和拆箱的概念 基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。Java语言规范中说道&#xff1a;在许多情况下包装与解包装是由编译器自行完成的&#xff08;在这种情况下包装称为装箱&#xff0c;解包装称为拆箱&#xff09…

AcWing55. 连续子数组的最大和

输入一个 非空 整型数组&#xff0c;数组里的数可能为正&#xff0c;也可能为负。 数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。 要求时间复杂度为 O(n)。 数据范围 数组长度 [1,1000]。 数组内元素取值范围 [−200,200] 样例 输入&#xff1a;[1,…