leetcode 算法题目学习笔记 - 序号1
1.两数之和
https://leetcode.cn/problems/two-sum/
简要说明:
1.给定一个数组和一个数字
2.要求找到数组中某两个元素,使得他们相加等于所给数字(将所给数字拆为数组中的某两个个元素)
3.以数组形式返回两个下标 否则返回空指针
- 返回的下标没有顺序要求
- 假设有唯一解,即只能在数组中找到两个或者零个元素符合要求
初始思路:
-
[暴力算法] 做匹配:循环嵌套,外层循环先对数组进行遍历[i],内层循环也对数组进行遍历[j](但跳过外层循环的元素),遍历时检查元素[i]和元素[j]相加是否为所给数字
- 时间复杂度: O(n^2), 最好情况一次通过,最坏情况内外循环执行完毕但找不到匹配元素,比较语句执行了n^2次
- 空间复杂度: O(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 {}; } };
优化思路
-
[优化算法] 做匹配:在暴力匹配过程中,查找是消耗时间的大户。如果利用哈希表查找会更加快速。
相关资料
https://www.cnblogs.com/Brakeintime/p/18425002
- 时间复杂度: O(n), 最好情况一次通过,最坏情况数组遍历完毕找不到元素,比较语句执行n次
- 空间复杂度: O(n), 解法消耗的空间与给定数组大小线性相关(因为我们建立了哈希表)
点击查看代码
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { std::unordered_map<int, int> hashmap; for(int i = 0; i < nums.size(); i++){ auto solve = hashmap.find(target - nums[i]); if (solve != hashmap.end()) return {solve->second, i}; hashmap[nums[i]]=i; } return {}; } };
合集:
Cpp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效