LeetCode热题100(1)

【Leetcode 力扣热题100 #1 两数之和】 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素你可以按任意顺序返回答案。 阅读详情

49. 字母异位词分解

1、题解

这道题如果拿两个字符串进行两两比较,依次遍历数组,是不是时间复杂度就是O(N2);但是看题解有提到“字母异位词是可以重新排列形成彼此的”,那可不可以尝试把每个字符串都先排列之后作为key值,字母异位词不就可以匹配成功,然后插入到哈希表里面吗?

2、代码实现

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        //搞个tmp字符串排序,排序后的结果作为key值,原字符串作为value,匹配成功插入hash表
        unordered_map<string, vector<string>> hash;
        for(auto &s : strs)
        {
            string tmp = s;
            sort(tmp.begin(), tmp.end());
            hash[tmp].push_back(s);
        }
        //提取hash表里的vector<string>
        vector<vector<string>> ret;
        for(auto &[x, y] : hash)
        {
            ret.push_back(y);
        }
        return ret;
    }
};

128. 最长连续子序列

1、题解

这道题要我们找到数字连续的最长序列,并且时间复杂度为O(N),看了上面几个实例,会发现给的数组是有可能出现重复的数字的,所以我们在找数字连续的最长序列时:应该先去重,把所有元素都扔到哈希表。
不需要先给它们排序,只要遍历这个哈希表,如果元素的前一个元素(元素值-1)存在,说明这个元素就不是连续序列的开头,那就直接跳过;如果元素的前一个元素(元素值-1)不存在,,说明这个元素就是连续序列的开头,接下来就一直查找“元素值+1”的元素是否存在,并且更新长度。

2、代码实现

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> s(nums.begin(), nums.end());
        int max_len = 0;
        for(auto e: s)
        {
            if(s.count(e-1) == 0)//e是序列开头
            {
                int cur = e;
                int len = 1;
                while(s.count(cur+1))//计算数字连续序列长度
                {
                    len++;
                    cur++;
                }
                max_len = max(max_len, len);//更新最长连续长度
            }
        }
        return max_len;
    }
};

分析算法复杂度,哈希查找时间复杂度是O(1),外层只有一个for循环,总的时间复杂度应该是O(N)。

283. 移动零

1、题解

这道题有个很关键的信息:必须保持非0元素的相对顺序,如果用双指针,一个在开头,一个在结尾,那么在交换的过程中势必会改变元素的相对顺序。
我们可以将数组分为三部分,【非0区间、0区间、未被遍历区间】,当我遍历的元素不是0时,只要把这个元素加入到非0区间末尾,就是交换nums[cur] 和 nums[dst++]。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //数组分为三部分:非0, 0,未被遍历的
        int dst = -1;
        for(int cur = 0; cur < nums.size(); cur++)
        {
            if(nums[cur])
            {
                swap(nums[++dst], nums[cur]);
            }
        }
    }
};

11. 盛水最多的容器

1、题解

这道题要我们找区间面积最大的面积,那我们要先搞清楚面积怎么算,是不是宽度(下标差)* 高度(下标对应值小的)。如果说用暴力枚举,每找一个元素,就和后面的所有元素进行计算面积,那算法复杂度就是O(N2)了。

按照上面的图,我先拿[6, 2, 5, 4, 8]这个区间,假设我先计算最左边和最右边的面积v,按照暴力算法,是不是还要枚举6和 [2, 5, 4] 的面积,但是有必要吗?首先 面积 = 高度 * 宽度,你考虑6和其他数字,宽度一定减小,高度呢?高度要么减小,要么不变,那面积是不是一定减小,那就没有必要再继续枚举6和 [2, 5, 4] 的面积。所以我们在做这道算法题时,是可以舍弃掉高度小的那个数的。

2、代码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1;
        int max_area = 0;
        while(left < right)
        {
            int v = (right - left) * min(height[left], height[right]);
            max_area = max(max_area, v);
            if(height[left] < height[right]) left++;//高度小的没必要考虑和其他元素构成的区间面积
            else right--;
        }
        return max_area;
    }
};

15. 三数之和

1、题解

这道题要我们找到的是三个不用下标的数,它们的和为0的三元组,看示例1可以发现,有重复的三元组是需要去重的。
(1)暴力算法:我们第一眼想到的就是我固定一个数,遍历,再固定一个数,再遍历,然后求和,这样的话时间复杂度肯定是O(N3)
(2)暴力优化:如果我们把数组排个序,然后呢还是遍历,把结果扔到哈希表去重,那这样时间复杂度还是O(N3)。
(3)我们可以在排序后,先固定一个数a,然后在剩下的区间里找两个数的和为 target = 0 - a,这样一来不就变成了双指针问题了吗,时间复杂度降到O(N2)了;
不过这里要注意,之前我们做双指针问题时,只要有一种情况成立就可以返回,这道题是要找到所有的三元组哦,所以要把剩下的区间都遍历完;
并且这道题要求不能重复,你成立的三元组里是不能存在相同的三元组,可以直接把这个三元组扔到哈希表里去重;还有一种办法,我们不是把数组排序了吗,那当我找到一组成立的结果时,如果有重复的数字,也是在结果附近,我直接比较附近的数的大小,移动我的 left 指针和 right 指针不就好了;除了子区间不能重复,固定数是不是也不能重复,这个地方也要注意

2、代码实现

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());
        int i = 0;
        while(i < nums.size() - 2)
        {
            int target = 0 - nums[i];//固定一个数,在后面的区间使用双指针
            int left = i + 1, right =  nums.size() - 1;
            while(left < right)
            {
                int tmp = nums[left] + nums[right];
                if(tmp > target) right--;
                else if(tmp < target) left++;
                else//找到目标两个下标了,进行插入,然后去重
                {
                    ret.push_back({nums[i], nums[left++], nums[right--]});
                    while(left < right && nums[left] == nums[left-1]) left++;
                    while(left < right && nums[right] == nums[right+1]) right--;
                }
            }
            i++;
            //注意i也要去重
            while(i < nums.size() - 2 && nums[i] == nums[i-1]) i++;
        }
        return ret;
    }
};

相关推荐

ANSYS ICEM CFD 2023R2 结构化网格实战:翼型绕流 10 步生成高质量六面体网格

在计算流体力学(CFD)分析中,网格质量直接决定了仿真结果的精度和收敛性。对于翼型绕流这类典型的外部流动问题,结构化网格因其规则的节点排列和优异的边界层捕捉能力,成为高精度模拟的首选方案。通过在后缘处添加局部H型拓扑,并将过渡区增长率降至1.1,最终使网格质量指标提升40%,计算收敛速度提高2倍。这印证了结构化网格在复杂流动模拟中的不可替代性——虽然初期投入时间较多,但能显著提升计算精度和稳定性。在开始网格划分前,合理的几何准备是确保后续流程顺利的关键。对于翼型绕流,O型网格拓扑能提供最佳的边界层适应性。

weixin_30731305的博客 362

力扣热题100--day1

对于 nums 中的元素 x,以 x 为起点,不断查找下一个数 x+1,x+2,⋯ 是否在 nums 中,并统计序列的长度。这个题我自己想解法的话只能想到用两个指针一前一后暴力枚举所有的(i,j)组合,但是在数据量大时会出现超时的问题。不在 → 起点 → 找到 2、3、4 → 连续长度 = 4(执行完while此时y=5,因此长度=y-x)如果是起点的话,使用while循环来检查x+1,x+2,...是否存在,直到找不到。例如:输入:[100, 4, 200, 1, 3, 2]的题解,还是一知半解。

weixin_58753945的博客 698

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 542

【LeetCode力扣热题100】【LeetCode 1】两数之和

两层循环,遍历所有的组合,直到满足条件,返回结果。

一个写程序的 492

6.2 磁悬浮轴承:软件架构与实现

本文系统阐述了磁悬浮轴承控制系统的软件架构与实现方法。采用分层架构设计,包括硬件抽象层、实时控制内核、控制算法层和应用层,确保系统实时性和可靠性。重点分析了电流环、位置环等关键控制任务的调度策略,比较了不同硬件平台(DSP、ARM、FPGA)的软件实现方案。强调模块化设计、配置化管理等工程实践,并详细介绍了从算法仿真到系统联调的完整开发流程。最后指出严格的测试验证是保证系统性能的关键,需通过多阶段测试评估起浮时间、稳态精度等核心指标。

技术工作者 752

数字图像处理基础实验(二):直方图均衡化

一、实验内容及原理 1、计算灰度图像的归一化直方图 具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在 窗口中以图形的方式显示出来 步骤: (1)初始化一个256大小的数组,存放图像中每级灰度值的像素点的个数 (2)遍历整张图像 (3)归一化数组 2、灰度图像直方图均衡处理 具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。 步骤: (1)读取该像素点的灰度值 (...

lyd1995的博客 4525

第1题 力扣LeetCode 热题 HOT 100 (56. 合并区间)

第1题 力扣LeetCode 热题 HOT 100 (56. 合并区间) 题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 示例 1: 输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为

weixin_45440200的博客 415

Shader Graph入门

Shader Graph 简介

zaizai1007的博客 1万+

【算法笔记】力扣热题100(LeetCode hot-100) 1:两数之和

根据题目描述,求两个数的和等于目标值的下标。再转换成大白话就是,一堆数中找出两个数A和B,使得A+B=target。哈希表的key是数值,value是下标。遍历数组,如果 (target-当前数值) 在哈希表中,那么找到了答案。输入:我有一个数组[2,7,11,15],目标值是9。

不想当吗喽的博客 435

小众但实用:Python爬取钉钉/企业微信消息,实现办公数据自动化采集(完整版)

钉钉/企业微信的办公数据自动化采集,属于「小众但极度实用」的Python技巧——它不像爬虫爬取电商/网页数据那样被广泛关注,但能直接解决职场人的「刚需痛点」,把每天1-2小时的手动数据整理工作,变成「一键自动化完成」。这套技巧的核心价值,不在于「技术有多高深」,而在于「能真正落地、能真正提升效率」—— 几行简单的Python代码,就能解放双手,让你从繁琐的重复工作中解脱出来,专注于更有价值的核心工作。更重要的是:所有的技术和代码,都是基于「合规合法」的前提,守住了技术的底线,也守住了职场的原则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1931

SAP ABAP 四种传统的数据库视图类型介绍之二:Projection View

一是该 projection view 只暴露了底层 TADIR 表的四个字段,因此通过该 view 维护数据,在维护界面我们只能维护一条记录的四个字段,如下图所示。使用 Projection view 的优点在于其设计灵活性:如果系统中原始的数据库表字段较多,通过投影仅保留关键信息可有效降低从数据库层到应用层之间的数据传输负担,且保持数据的一致性。其二是笔者之前的文章提到,TADIR 是 ABAP 系统重要的对象注册表,如同 window 操作系统的注册表一样,一般的应用开发人员不应该去修改其内容。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1441

力扣LeetCode 热题 HOT 100 C++ (1/100) 两数之和

力扣LeetCode 热题 HOT 100 C++ (1/100) 两数之和

weixin_51617698的博客 1204

网络发生环路了,别慌,这些步骤一定要安排起来!

网络环路是指在计算机网络中,数据包因为某种原因在多个网络设备之间不断循环,形成了一个闭环。这样数据包就永远也无法到达目标,导致网络的流量滞留,设备间的资源耗尽,最终网络性能受到严重影响。网络环路虽然是常见的网络故障,但只要掌握正确的排查和解决方法,面对环路问题时,你就能冷静应对,迅速恢复网络的正常运行。希望这篇文章能帮助你更好地理解和处理网络环路的问题,让你的网络环境更加稳定可靠!🚀📡如果你有任何疑问,或者在实际操作中遇到困难,随时可以联系我,我们一起攻克技术难题!

网络技术联盟站 1965

Python3—LeetCode 力扣热题100-1.两数之和

因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。解法1——双循环暴力,时间复杂度:o(n²)从下标0开始匹配后面的值,一个一个算出结果。进阶解法2——哈希表,时间复杂度:o(n)整数,并返回它们的数组下标。你可以想出一个时间复杂度小于。你可以按任意顺序返回答案。,请你在该数组中找出。

weixin_68929687的博客 340

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

力扣LeetCode 热题HOT 100 #1(两数之和)

题目: 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4],...

weixin_50213357的博客 268

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode热题100(一)—— 1.两数之和

【代码】LeetCode热题100(一)—— 1.两数之和

Young_4的博客 1035

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【LeetCode】力扣刷题热题100道(1-5题)附源码 链表 子串 中位数 回文子串(C++)

【LeetCode】力扣刷题热题100道(1-5题)附源码(C++)

你要拥有一个你喜欢并且热爱的人生 7534

【LeetCode热题100】No.1——两数之和(Java)

本文主要讲解 LeetCode 热题 100 的第一题 “两数之和”。先明确题目要求,即从整数数组中找出和为目标值的两个整数并返回下标,给出示例与提示。接着分析两种解法:一是暴力解法,通过双重循环查找,时间复杂度 O (n²),效率低;二是哈希表优化解法,以空间换时间,将查找互补元素时间降至 O (1),整体时间复杂度 O (n),通过两个测试案例验证哈希表解法正确性,最后总结核心启示,即需快速查找元素时优先用哈希表,并预告后续讲解内容。

Mr.Ja的博客 2304

LeetCode 热题 100 ---1、两数之和

科班五年,鄙人最终也是走上了卷Java的道路,LeetCode Hot100肯定是逃不掉的,那么就从这里开始记录我的学习工作日常吧!

chenhao_java554的博客 870

【LeetCode热题100】 1-5

力扣hot100前五题

2401_87046050的博客 826

LeetCode 热题100 No.1——两数之和

之后想到用哈希表,先将数组元素和对应下标存入哈希表,利用哈希表 O (1) 的查找特性,再次遍历数组,对每个元素计算需要配对的目标差值,在哈希表中查找该差值,若存在且不是同一个元素,则返回两个下标,借助哈希把暴力的 O (n²) 时间优化到 O (n)。一开始我第一反应就是暴力两层循环,遍历两个数相加看等不等于 target。暴力写出来确实能过,但是时间复杂度高是O(n^2)。值得注意的是,map 存的是(数值→下标),因为最后要获取下标,还有就是注意。,不要把当前元素先放进 map 再判断,会出错。

2502_93578012的博客 227

【算法笔记】力扣热题100(LeetCode hot-100)53. 最大子数组和 1.前缀和 2.动态规划

力扣热题100题 leetcode 53.最大子数组和。给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组,返回其最大和。1:使用前缀和的方法。2:使用动态规划

不想当吗喽的博客 761

LeetCode 热题 100 题解(1):哈希

哈希表是一种高效的键值对存储结构,它利用哈希函数将任意类型的键转换为数组索引,从而实现平均 O(1) 时间复杂度的查找、插入和删除操作。通过哈希函数计算键对应的哈希值,再将其映射到数组的特定位置。对比一般的只能用数字下标查找的数组,哈希表可以用字符串、数字、元组等任意可哈希不可变类型作为查找标识。值得一提的是,不可变类型指的是数据一旦创建就不能原地修改,想要改只能新建一份新对象的数据,而可变类型的数据可以直接修改内存中的内容,无需更换存储地址。# 列表可变,原地修改,地址不变lst = [5]

zjr060330的博客 222

力扣热题100刷题day60|206.反转链表、1.两数之和

倒数第二步,head = currB 以后,并没有检查head的指向是否为空,就让currB = head.next;如果head此时指向为空,那么 head.next就会报错:空指针异常NullPointerException;2.最后返回的不是head;

m0_64265848的博客 298

LeetCode热题100—1

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。应该只用于指示返回数组的大小,而不是存储结果。数组,调用者需要负责释放该内存。整数,并返回它们的数组下标。你可以按任意顺序返回答案。的数组,用于存储结果。如果没有找到解,设置。,请你在该数组中找出。

Lcberg的博客 625

LeetCode 热题 100 ----- 第 1 题:两数之和

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。题目资源 源自力扣(LeetCode)的那两个整数,并返回它们的数组下标。,请你在该数组中找出和为目标值。

HassanZHANG的博客 296
上一篇: Linux系统--信号
下一篇: MySQL---索引特性
bugu___
博客等级 码龄2年 63粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值