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

OpenCV 算法梳理分析 本文系统梳理了OpenCV的核心算法体系,从模块架构到具体函实现。OpenCV采用分层设计,包含基础I/O、图像处理、特征检测、视频分析和智能算法五大层次,所有模块基于统一的Mat数据结构。重点分析了imgproc模块的8类图像处理算法(滤波、形态学、阈值化等),features2d模块的特征检测与匹配流程(SIFT/ORB等算法对比),以及objdetect、video、calib3d等模块的核心功能。针对不同场景提供了算法选型建议,如高斯噪声推荐GaussianBlur,特征匹配推荐ORB+Flann 阅读详情

哈希表

数值很小,用数组;数值很大,用set(集合);如果有对应关系,就用map(映射)

数组:将自身的序号(索引)与实际数据大小画等号

242.有效的字母异位词

判读两个序列中的字母是否相同(个数相同即可,顺序可以不同)

题目链接

视频链接

思路

暴力解法,双排序寻找字母

看完代码随想录之后的思路:

利用哈希表,加入数组。重要的是利用了索引,使得原来无序的东西有了索引,查找起来更快。

原始无序的东西需要遍历,而有序的东西只要根据索引直接查找即可。

class Solution {
public:
    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;
    }
};

收获:

astii值直接相减就可以,得到的就是数值差。

数组的定义,要想让所有数值为0 ,不能=0,而是写={0}

349. 两个数组的交集

寻找两个数组中相同的元素,并且将重复的元素删除

题目链接

视频链接

思路

数组哈希值求解,但又隐约感觉需要用到映射(单个元素会出现多次)

看完代码随想录之后的思路:

用哈希的集合(set)求解,重复元素删除直接用unordered_set,查找直接用find函数

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

哈希数组法,用一个哈希数组来对其中一个数组元素的出现计数,然后使用另一个数组元素作为索引来核实重复。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
            unordered_set<int> result_set;
            int hash[1005]={0};//这里是题目说了小于1000
            for(int num:nums1)
            {
                hash[num]=1;
            }
            for(int num:nums2)
            {
                if(hash[num]==1)
                {
                    result_set.insert(num);
                }
            }
            return vector<int>(result_set.begin(),result_set.end()); 

    }
};

遇到的困难:

  • 如何删除重复的元素:unordered_set的数据类型,在代码随想录链表综述里
  • 拷贝已有容器,删除重复元素后生成新容器:

set 类模板还支持取已有 set 容器中的部分元素,来初始化新 set 容器

std::set<std::string> myset{ "http://c.biancheng.net/java/",
"http://c.biancheng.net/stl/",
"http://c.biancheng.net/python/" };
std::set<std::string> copyset(++myset.begin(), myset.end());
由此初始化的 copyset 容器,其内部仅存有如下 2 个 string 字符串:
"http://c.biancheng.net/python/"
"http://c.biancheng.net/stl/"

for循环的冒号写法

在C++11中,我们可以在for循环填加冒号 : 来简化这一过程:

//随机定义的数组
int array[10] = { 54, 23, 78, 9, 15, 18, 63, 33, 87, 66 };
    
for (auto a : array) {
    cout << a << " ";        //输出:54 23 78 9 15 18 63 33 87 66
}

如果传入的迭代参数类型为非引用时,做的是值拷贝,因此修改数据是无效的。如果传递的是引用,则可以改变原数组的值。

find的判断:

如下为 find() 函数的语法格式:

InputIterator find (InputIterator first, InputIterator last, const T& val);

其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。

该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。

所以,!=说明在中间找到了,==说明没找到,返回了最后last的迭代器

收获:

数组哈希:有两列数据,不是给两列数据各自开一个数组,然后比较。而是使用一个数组,两列数据充当索引。

定义数组时,一定写int hash={0}!!!不定义0会报错!!

重点:

数组的哈希映射是最快的

第202题. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

题目链接

思路

想使用数组哈希表

看完代码随想录之后的思路:

因为出现的和不确定大小,所以使用集合哈希更合适。

先判断拆分后的平方和是否达到1,然后判断之前是否出现过。

class Solution {
public:
    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;
        }
    }
};

遇到的困难:

1. 拆分求平方和:余数求平方,然后除以10,接着循环,直到所有位算过一遍,除以10后成为0,结束循环

2. 出现的错误:

1. 平方和记得是+=,少写一个+,整个意思就不同了

2. 判断是否在集合中:不等于end,说明出现过了,进入循环,返回false,否则插入。不能搞反了

收获:

find、end、insert都是方法,用set点出来

1. 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。

题目链接

视频链接

思路:

暴力解法,双循环找前面的元素中是否和当前元素相加等于target

看完代码随想录之后的思路:

哈希map,看讲解中说道map找起来要比循环找起来快

循环一遍数组,遍历每个元素时,找前面是否出现过匹配的元素,出现了就返回,没出现就插入map

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++)
        {
            auto iter=map.find(target-nums[i]);
            if(iter!=map.end())
            {
                return {iter->second,i};
            }
            else
            {
                map.insert(pair<int,int>(nums[i],i));
            }
        }
        return {};
    }
};

遇到的困难:

map的定义: std::unordered_map <int,int> map;

map下find的定义:auto iter = map.find(target - nums[i]);

两个数的返回值,用 { } 框起来

map元素的value值表示:iter->second

map中key和value插入:map.insert(pair<int, int>(nums[i], i));

收获:

map的时间复杂度比遍历低(为什么?)

重点:

为什么要用哈希法:判断是否在历史中出现过

为什么用map:因为出现了需要同时存储两种信息的情况。set中是无序的元素集合,没有索引;而数组是因为没有确定的范围。

用unordered_map:无序不重复更适合这种情况

为什么key存值value存下标:查找的是值,所以用key存值

map是用来存遍历过的元素,所以最后的insert不能省

VM下安装linux虚拟机(ubuntu)和Intel parallel XE 2013(ifort2013) VM下安装ubuntu和ifort2013跑自己的模式 由于新冠疫情,本人只能在家工作,很多重要的文件和程序都留在了办公室的linux机器上,工作无法正常开展。本来准备去办公室把机器搬回家不曾想学校所有门禁都关闭,不许进入,何时解禁也没有明确日期。科研不能等人,没条件科研只能想办法创造条件了。 以前在自己的笔记本(windows)上装过一次VM和ifort但无奈程序不能正常跑,所以之前就放弃了。本... 阅读详情

相关推荐

【STM32H7实战】SDMMC总线优化与FatFs文件系统高效读写技巧

本文详细介绍了STM32H7中SDMMC总线优化与FatFs文件系统高效读写技巧,包括时钟配置、DMA传输、缓存策略等关键优化点。通过实测据对比,展示了从2.7MB/s提升至11.8MB/s读取速度的优化效果,适用于需要高性能SD卡读写的嵌入式开发场景。

e6f7g8h9i的博客 452

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

给定两个字符串 s 和 t ,编写一个函来判断 t 是否是 s 的字母异位词。示例 1: 输入: s = "anagram", t = "nagaram" 输出: true示例 2: 输入: s = "rat", t = "car" 输出: false你可以假设字符串只包含小写字母。也可以使用defaultlist,这样就不用把字符通过函变成字存储了(字—>字典)

2401_87652382的博客 1475

北斗导航 | 从零开始学习基于奇偶矢量的接收机自主完好性监测(RAIM)算法及改进

接收机自主完好性监测(Receiver Autonomous Integrity Monitoring, RAIM)是GNSS接收机内部的一种算法,它仅利用冗余的伪距观测量来判断定位结果是否可靠、是否存在故障卫星,并能识别和排除故障卫星。奇偶矢量法是RAIM最经典的实现方式之一,它将不可直接观测的测量误差映射到一个“奇偶空间”中,使故障检测变得简单且服从精确的概率分布。w\mathbf{w}w虽然能反映故障,但它的协方差矩阵不是单位阵,各分量相关,不利于统计检验。奇偶矢量通过一个正交变换P。

尘世冰封的专栏 369

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

给定两个字符串s和t,编写一个函判断t是否是s的字母异位词。用一个数组来记录字符串s中各字母出现的次,然后再遍历字符串t,对出现的字母数组中进行-1的操作,最后判断数组是否所有元素为0就行。小写字母的ASCII是26个连续的值,不需要记住字符的ASCII,只需要将所有字符的ASCII减去'a'的ASCII,求出一个相对的值来,就能将字符映射到0~25的索引下标上。

BEK647的博客 1997

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

详细的哈希表理论可以点击上面链接查看。因为我不熟悉c++容器,所以借着这几天的练习,我打算熟悉一下常用的容器操作。

C_J314的博客 1671

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

std::set和std::multiset的底层实现都是红黑树,而std::unorderedset的底层是哈希表,orderedset的读写效率是最高的,并不需要对据进行排序, 而且还要让据不重复(unorderedset会对据进行自动去重)std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

2301_79523191的博客 944

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

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。

KLeinLAN的博客 289

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

今天是哈希表练习的第一天:首先复习了哈希表的理论基础:哈希表是根据关键码的值直接进行访问的数据结构,,有数组,map和set这几种如果hashCode得到的值大于tableSize,那么就要对数组进行一个取模操作,通过哈希函来映射到哈希表的索引;如果发生了哈希碰撞(即两个名字都被链接到了同一个index, 那么需要用其他方法来解决问 (拉链法和线性探索法)因为我们要使用额外的数组,set或者是map来存放据,才能实现快速的查找。JS代码实现。

m0_55348595的博客 438

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

用hash表存储对应字母出现过的频率,另一个数组的元素出现在hash表中就--,最后如果hash表中出现不等于0的值,那就不是有效字母异位词

weixin_39877528的博客 800

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

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

方可申不翘二郎腿的博客 148

据库连接算法详解:从基础概念到嵌套循环优化

2.重复键在归并连接中的处理:排序归并连接遇到相同键时,需要保存或回溯同一键对应的记录组,然后输出笛卡尔积。(2)外连接:即使一方没有据,也保留该侧据,用NULL填充。对S中的键计算哈希值;(3)连接基:连接结果的行可能远大于任意一张输入表。设外表有R个页面,内表S个页面,比较次O(R+R*S)5.哈希连接的限制:最适用于等值连接,不直接适用于比较。(1)build阶段:对较小的关系R建立哈希表。(1)内连接:只保留两张表之中能够匹配的内容。若R有M行,S有N行,则比较次为O(MN)

jiangxiaohanya的博客 238

小红书 算法一面 十一

例如 **Soft MoE** 采用这种方式,大幅提升负载均衡性,但会增加计算开销。- **熵正则化**:直接最大化门控概率分布的熵,熵越大表示分布越均匀,公式为 $\mathcal{L}_{ent} = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^K p_{ik}\log p_{ik}$。- **核心原理**:源自 **GShard** 和 **Switch Transformer**,通过最小化专家选择概率分布的熵,迫使门控网络给每个专家分配相近的 token 量。

XLYcmy的博客 438

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 259

算法日常・每日刷--<BFS>4

目摘要: 给定一个由'X'和'O'组成的矩阵,要求捕获所有被'X'完全包围的'O'区域(即不与边界连通的区域),并将其替换为'X'。解法核心是逆向处理: 标记边界连通区域:遍历矩阵四边,对边界上的'O'进行BFS/DFS,标记所有与之连通的'O'为临时符号(如'.'),表示这些区域未被包围。 批量修改:遍历整个矩阵,将未被标记的'O'(被包围的)改为'X',同时恢复标记的'.'为'O'。 示例: 输入: [['X','X','X','X'], ['X','O','O','X'], ['X','X','O'

2503_92261635的博客 258

10.LeetCode算法讲解--滑动窗口--最大连续为一的个

利用滑动窗口解决最大连续1的个

Jammy_1的博客 221

AI辅助芯片制造:算法与工程化落地

《国产DRAM龙头长鑫科技上市创纪录,AI技术重塑芯片制造新范式》 国产DRAM龙头企业长鑫科技7月27日登陆科创板,创下3.31万亿元市值,成为A股"一哥"。作为大陆唯一实现DRAM大规模量产的IDM企业,长鑫科技标志着国产存储产业的重要突破。随着AI算力需求激增,DRAM市场迎来高速发展期。AI技术正在深度改变芯片制造模式,在工艺仿真、缺陷检测、设备维护等环节发挥关键作用,显著提升良率和效率。长鑫科技高管推荐的新书《AI辅助芯片制造:算法与工程化落地》系统解析了AI赋能半导体制造的实战方案

weixin_43178406的博客 1万+

二刷hot100-70.爬楼梯

dp数组初始化:dp[n+1];

2302_78497251的博客 50

S 曲线加减速算法完整详解(C# 原生实现,无第三方库)

S 曲线加减速是工业运动控制核心轨迹规划算法,相比梯形曲线,依靠约束加加速度 Jerk 实现加速度连续变化,有效消除机械冲击与振动。本文完整讲解七段式 S 曲线原理、阶段推演、时间预规划逻辑,剖析短行程自动裁剪等工程难点。提供无第三方依赖原生 C# 完整实现,内置运动状态机,支持正反方向运动,基于解析多项式实时求解位置、速度、加速度,无积分累积误差。代码可直接用于伺服上位机、模组轨迹发生器,亦可精简移植嵌入式平台。同时对比算法优劣与适用场景,适合工控开发、伺服调试、嵌入式运动算法学习者参考。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 982

IMX415摄像头驱动原理图和PCB【Altium Designer可修改源文件】

IMX415摄像头驱动原理图和PCB,Altium Designer可修改源文件

上一篇: 代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
下一篇: 代码随想录算法训练营第7天|第454题.四数相加II,383. 赎金信,15. 三数之和,第18题. 四数之和
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值