IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【1.两数之和】数组+哈希表 -> 正文阅读

[数据结构与算法]【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], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
?

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

  • 输入的是一个int型数组nums[]、目标值target。第一个要解决的就是如何读取输入的数据到内存中。
  • 因为题目数组中同一个元素在答案里不能重复出现,也就是说两个下标不能重复。设从数组中取出的两个数的下标是x和y(x和y不能相等),那么x的取值范围是0~len-2,y的取指范围是x+1~len-1。用循环嵌套(两层for循环)来遍历每一种取指对,如果遇到num[x]+num[y]==target,就返回这两个下标

代码1:【暴力枚举】

class Solution {
public:
    //返回值是int型的数组,两个参数分别是int型的数组nums[],int型的整数target
    vector<int> twoSum(vector<int>& nums, int target) {
        int len = nums.size();      //用一个变量记录输入的数组的长度,防止多次调用计算
        for( int i=0; i<len-1; i++ )
        {
            for( int j=i+1; j<len; j++ )
            {
                if( nums[i]+nums[j] == target )
                    return {i,j};                //表示找到了符合条件的,输出
            }
        }
        return {};        //没找到符合条件的,输出空
    }
};

代码2:【哈希表】

哈希表是什么?

https://www.cnblogs.com/SlipperyJimmy/p/14750994.html#:~:text=C%2B%2B%E4%B8%AD%E5%85%B3%E4%BA%8E%E5%93%88%E5%B8%8C%E8%A1%A8%E6%9C%89%E5%BE%88%E5%A4%9A%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E5%B9%B3%E6%97%B6%E4%BD%BF%E7%94%A8%E7%9A%84%E6%AF%94%E8%BE%83%E5%A4%9A%E7%9A%84%E6%9C%89unordered_set,%E8%B7%9F%20unordered_map%E3%80%82icon-default.png?t=M85Bhttps://www.cnblogs.com/SlipperyJimmy/p/14750994.html#:~:text=C%2B%2B%E4%B8%AD%E5%85%B3%E4%BA%8E%E5%93%88%E5%B8%8C%E8%A1%A8%E6%9C%89%E5%BE%88%E5%A4%9A%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E5%B9%B3%E6%97%B6%E4%BD%BF%E7%94%A8%E7%9A%84%E6%AF%94%E8%BE%83%E5%A4%9A%E7%9A%84%E6%9C%89unordered_set,%E8%B7%9F%20unordered_map%E3%80%82https://www.cnblogs.com/averyfork/p/14420238.htmlicon-default.png?t=M85Bhttps://www.cnblogs.com/averyfork/p/14420238.html

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;        //创建一个哈希表,key是int,value也是int
        for (int i = 0; i < nums.size(); ++i) 
        {
            auto it = hashtable.find(target - nums[i]);
//auto的原理就是根据后面的值,来自动推测前面的类型是什么。
//auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。
//hashtable.find(target - nums[i]);在hashtable中查找value为target-nums[i]的,找到则返回一个迭代器,找不到返回hashtable.end()

            if (it != hashtable.end())         //表示在哈希表中找到了符合条件的值,it是迭代器
            {
                return {it->second, i};        //返回找到的值value和另一个数在数组中的下标i
            }

            //为什么返回的是second的呢,因为这个哈希表将下标作为value,将数组的值作为key
            //下面这个语句就是做这一步,有两种情况
            //1.如果没找到,则将当前数组中的nums[i]作为hashtable的key,将下标i作为value插入哈希表
            //2.如果找到了,也将当前数组中的nums[i]作为hashtable的key,将下标i作为value插入哈希表
            hashtable[nums[i]] = i;            //这就能保证,输出的两个下标不会重复
        }

        return {};    //表示没找到,返回空
    }
};

复杂度分析

【两个for循环】

  • 时间复杂度:O(N^2),其中 N?是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
  • 空间复杂度:O(1)。

【哈希表】

  • 时间复杂度:O(N),其中 N?是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
  • 空间复杂度:O(N),其中 N?是数组中的元素数量。主要为哈希表的开销。

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:52:38  更:2022-09-21 00:57:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:39:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码