哈希表-1.两数之和-力扣(LeetCode)

时光荏苒,博主也是再次来到leetcode的起点了,今天的我早已不是过去的我,回归正题接下来开始我们的算法之旅吧

cpp 复制代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int* arr =(int*)malloc(sizeof(int)*2);
    * returnSize=0;
    for(int i = 0;i<numsSize-1;i++)
    {
        for(int j = i+1;j<numsSize;j++)
        {
            if(nums[i]+nums[j]==target)
            {
                arr[0]=i;
                arr[1]=j;
                * returnSize=2;
                return arr;
            }
        }
    }
    return arr;
}

ps.这是博主在今年1月17日,提交的代码,那时博主还很小白

一、题目解析

1、同一个元素不能使用两次

2、返回答案的顺序任意

二、算法原理

解法1:暴力解法(向后枚举)

解法2:暴力解法(由前向后枚举)

解法3:在解法2的基础上使用哈希表优化

1、为什么要用哈希表优化?

我们需要频繁的查找某一个元素,用哈希表可以达到O(1)的查找

2、该如何使用哈希表?

根据题目的需求,我们的哈希表中要存储<numsi,i>,这里的i是对应的下标;在遍历元素时,先固定一个值numsi,然后在哈希表中找target-numsi,如果存在,则返回{hashtarget-nums\[i,i},如果不存在,则把numsi和i插入到哈希表中

为什么不在解法1的基础上用哈希表优化?

1、在一般情况下是可以的,我们把所有元素放到哈希表中,然后查找

2、但如果存在numsi = 4,target = 8时,在哈希表中查找,会违反题目条件,即相同元素使用两次,需要进行条件的特判,所以不在解法1的基础上优化

三、代码示例

解法1:暴力解法(向后枚举)

cpp 复制代码
//解法1:暴力枚举(向后枚举)
    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 {0,0};
    }

这里的{i,j}构造一个vector的匿名对象

解法2:暴力解法(由前向后枚举)

cpp 复制代码
//解法2:暴力解法(由前向后枚举)
    vector<int> twoSum(vector<int>& nums, int target)
    {
        for(int i = 0;i<nums.size();i++)
        {
            for(int j = 0;j<i;j++)
                if(i != j && nums[i]+nums[j] == target)
                    return {i,j};
        }
        return {0,0};
    }

解法3:在解法2的基础上使用哈希表优化

cpp 复制代码
 //解法3:哈希表优化
    vector<int> twoSum(vector<int>& nums, int target)
    {
        unordered_map<int,int>hash;
        for(int i = 0;i<nums.size();i++)
        {
            if(hash.count(target-nums[i]))
                return {hash[target-nums[i]],i};
            hash[nums[i]] = i;
        }
        return {0,0};
    }

看到最后,如果对您有所帮助,还请点赞、收藏和关注,一键三联支持一下,我们下期再见!

相关推荐
郝学胜_神的一滴14 小时前
Qt 高级开发 026:QTabWidget御道,从筑基到化境
c++·qt
apocelipes14 小时前
GNU GCC 多版本函数扩展
c语言·c++·linux编程
代码中介商15 小时前
C++完美转发与引用折叠全解析
开发语言·c++
雪度娃娃15 小时前
ASIO异步通信——多线程模型
开发语言·网络·c++·php
运筹vivo@16 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
一只齐刘海的猫17 小时前
【Leetcode】移动零
算法·leetcode·职场和发展
人道领域17 小时前
【LeetCode刷题日记】131.分割回文串,动态规划优化
java·开发语言·leetcode
王老师青少年编程17 小时前
信奥赛C++提高组csp-s之搜索进阶(迭代加深IDDFS)
c++·csp·信奥赛·csp-s·提高组·iddfs·埃及分数
liulilittle18 小时前
我从 BBRv1 到 KCC 的思考
网络·c++·tcp/ip·计算机网络·tcp·bbr·通信
落羽的落羽18 小时前
【项目】JsonRpc框架——开发实现1(细节功能、字段定义、抽象层、具象层)
linux·服务器·网络·c++·人工智能·算法·机器学习