• 【剑指offer系列】62. 和为S的两个数字


    这里是剑指offer系列的延续,作者将利用C++实现继续完成该系列的学习,剑指offer,喜欢的话可以点赞关注+收藏,加油更新中ing。


    题目62. 和为S的两个数字

    输入一个数组和一个数字 s,在数组中查找两个数,使得它们的和正好是 s。

    如果有多对数字的和等于 s,输出任意一对即可。

    你可以认为每组输入中都至少含有一组满足条件的输出。

    数据范围

    数组长度 [1,1002]。

    样例

    输入:[1,2,3,4] , sum=7
    
    输出:[3,4]
    
    • 1
    • 2
    • 3

    【题解】— 暴力、哈希表

    方法一:暴力

    穷举出每一种情况,如果两数之和等于target的,输出答案。

    1. i指向数对的第一个数字,从0到nums.size() - 2;
    2. j指向数对的第二个数字,从nums.size() - 1到i+1;
    3. 如果nums[i] + nums[j] == target, 返回[nums[i], nums[j]]。

    方法二:哈希表

    暴力法的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,[x, target - x] 即为答案。

    使用哈希表,可以将寻找 target - x 的时间复杂度降低到从O(N) 降低到 O(1)。

    创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在target - x,如果有返回[x, target - x]。如果没有,将 x 插入到哈希表中。

    复杂度分析:

    暴力两个遍历数组的循环,所以时间复杂度是O(n^2)。
    在i从0到nums.size() - 1过程总,j只遍历了一次,所以时间复杂度O(n)。
    
    • 1
    • 2

    C++代码实现:

    // 暴力
    class Solution {
    public:
        vector<int> findNumbersWithSum(vector<int>& nums, int target) 
        {
            for(int i = 0; i < nums.size() - 1; i++)//i指向数对的第一个数字,从0到nums.size()-2
            {
                for(int j = nums.size() - 1; j > i; j--)//j指向数对的第二个数字,从nums.size()-1到i+1
                {
    
                    if(nums[i] + nums[j] == target)//如果两数之和等于target
                        return vector<int>{nums[i], nums[j]};//返回数对
                }
            }
            return vector<int>{-1, -1};//穷举完没有答案,返回[-1,-1]
        }
    };
    
    // 哈希表
    class Solution {
    public:
        vector<int> findNumbersWithSum(vector<int>& nums, int target) 
        {
            unordered_map<int, int> hash;//创建哈希表
            for (int i = 0; i < nums.size(); ++i) {
                if(hash[target - nums[i]] == 0)//如果哈希表中没有target - nums[i]
                    hash[nums[i]]++;//nums[i]出现次数加1
                else//如果哈希表中有target - nums[i]
                    return {nums[i], target - nums[i]};//返回答案
            }
            return {};
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    剑指offer系列将后续持续更新,有帮助的话,欢迎点赞👍、收藏⭐️+关注✌️哟~


  • 相关阅读:
    HJ69 矩阵乘法
    C++STL-string类的实现(上)
    Java Web——JS中的BOM
    2023年华数杯数学建模C题母亲身心健康对婴儿成长的影响解题全过程文档及程序
    工信部—高级软件开发工程师认证
    神经网络与深度学习
    Flutter 知识集锦 | 监听与通知 ChangeNotifier
    用户行为数据案例
    Rust学习笔记:简单练习
    js 代码中的 “use strict“; 是什么意思 ?
  • 原文地址:https://blog.csdn.net/weixin_46020266/article/details/126065868