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 {};
    }
    };
posted @   Brakeintime  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示