首页 > 其他分享 >1. 两数之和题解

1. 两数之和题解

时间:2024-09-26 14:50:43浏览次数:10  
标签:insert target nums 题解 iter vector 哈希 两数

题目描述

[!NOTE]

总结:找出整数数组中两数之后等于目标值的两个数,然后返回其下标

给定一个整数数组 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
  • 只会存在一个有效答案

题解

暴力法

通过两个循环,遍历所有可能结果。时间复杂度为\(O(n^2)\)。

class Solution
{
    public:
    vector<int> twoSum(vector<int>& nums, int target)
    {
        int i, j;
        bool flag = false;
        for (i = 0; (i < nums.size() - 1) && !flag; i++)
        {
            for (j = i + 1; j < nums.size() && !flag; j++)
            {
                if (nums[i] + nums[j] == target)
                    flag = true;
            }
        }
        return vector<int>{i - 1, j - 1};
    }
};

[!NOTE]

for(initialization; condition; increment)循环执行顺序。

  1. 初始化。只在第一次循环中执行。
  2. 条件判断。符合条件才能执行循环体。
  3. 自增。执行完循环体后,就自增,再去进行条件判断。而不是先进行条件判断,再自增。
  4. 条件判断。
  5. 自增

哈希表

遍历数组,以<target - num[i], i>的方式存储哈希值(前者为哈希表的值,后者为索引下标)。整体只需要一次遍历,时间复杂度为\(O(n)\)。无序哈希表的查找复杂度为\(O(1)\),而有序哈希表的查找复杂度为\(O(lg(n)\) 。没有需求的话,一般都用无序哈希表。

class Solution {
    public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> uMap;
        unordered_map<int, int>::iterator iter;
        int i;
        for (i = 0; i < nums.size(); i++) {
            iter = uMap.find(target - nums[i]); // 可以直接auto iter
            if (iter != uMap.end()) {
                break;
            }
            uMap.insert({i, nums[i]});
        }
        return {iter->first, i}; // iter->first 是键还是值,取决于insert插入的方式
    }
};

常用API介绍

引入库,#include<unordered_map>

  1. insert():插入键值对,如果已经存在,则插入失败。

    • insert({index, value})

    • insert(pair(index,value))

  2. 获取键值对

    • iter->first

    • iter->second

    • map[index]:只获取值

  3. find():查找哈希表中是否存在这个键。如果存在,则返回指向该键值对的迭代器;如果不存在,返回end()迭代器。

    • auto iter = umap.find(2);
      // 或者
      unordered_map <int,int>::iterator iter = umap.find(2);
      
      if(iter != umap.end()) cout << "查找成功" << endl;
      
  4. erase():删除指定键及其对应的键值对

    • umap.erase(index)
  5. empty():判断是否为空,返回布尔值。

  6. clear():清空哈希表。

标签:insert,target,nums,题解,iter,vector,哈希,两数
From: https://www.cnblogs.com/coder-shane/p/18433451

相关文章

  • 「FJWC2020Day5-zzq」rng 题解
    题意简述一个长度为\(n\)的实数序列\(a_i\),其中\(a_i\)为\([l_i,r_i]\)中独立均匀随机选取的实数。你只能通过交换相邻两个数,使得\(a_i\)单调不降。你需要求出你最少操作次数的期望,对\(M=998244353\)取模。\(1\leqn\leq10^6\),\(0\leql_i\ltr_i\leq10^{1......
  • 留学期间学业常见问题解决办法,包括不能毕业的状况
    留学期间学业常见问题解决办法,包括不能毕业的状况【国外留学期间,遇到考试挂科的情况,影响了毕业,该怎么办?】考试挂科是一个很常见的现象,而国外院校,因为每个学校的规定不同,有的学校学生有补考机会,但是有的学校如果学生考试挂科情况很严重,或许就没有补考的机会了。这都没关系,重要的是,你......
  • 题解:P10104 [GDKOI2023 提高组] 异或图
    \(\text{Link}\)本题属于集合划分容斥,更多关于集合划分容斥的信息可观看详细揭秘:集合划分容斥的容斥系数。题意给定一个\(n\)个点\(m\)条边的图以及一个长为\(n\)的序列\(a_{1\dotsn}\),有一常数\(C\),你需要求出有多少序列\(b_{1\dotsn}\)满足\(0\leb_i\lea_i\)......
  • 题解:P10198 Infinite Adventure P
    \(\text{Link}\)题意给定\(n\)个数组\(c_{i,0\dotst_i-1}\),其中\(t_i\)为\(2\)的幂。有\(q\)次询问,每次询问给出三个参数\(x,T,\Delta\),接下来会执行\(\Delta\)次\(x\getsc_{x,T\bmodt_x},T\getsT+1\),求出最终的\(x\)。\(n,\sumt\le10^5\),\(q\le5\time......
  • 题解:P10998 Tuple+
    \(\text{Link}\)有意思,记录一下。题意给出\(m\)个互不相同的无序三元组\((u,v,w)\),求有多少无序四元组\((a,b,c,d)\)使得三元组\((a,b,c),(a,b,d),(a,c,d),(b,c,d)\)均存在。\(m\le3\times10^5\)。Bonus:\(m\le2\times10^6\)。题解回忆无向图三元环计数的做法,使......
  • 题解:P10590 磁力块
    \(\text{Link}\)来自传奇讨论区大神@年年有年的\(O(n\logn)\)做法!题意有\(n+1\)块磁铁\(0\simn\),每个磁铁都有四个属性\((d_i,m_i,p_i,r_i)\),如果你拥有了磁铁\(i\),那么你就能吸引并拥有所有满足\(d_j\ler_i,m_j\lep_i\)的磁铁\(j\),初始你只拥有磁铁\(0\),求最......
  • 题解:CF1799F Halve or Subtract
    \(\text{Link}\)介绍一下一种高维wqs的方法。此方法来自@YeahPotato的专栏严谨的WQS二分方法。题意给定一个长为\(n\)的序列\(v_{1\dotsn}\),三个常数\(d,a,b\)。你可以执行若干次以下两种操作:选择\(1\lei\len\),令\(v_i\gets\lceil\frac{v_i}{2}\rceil\)。......
  • 勇攀山丘小队(翻越篇)1——题解
    前言胸有丘壑,气吞山河。正片A题:考虑使用DP,由于题目给了2个a不能在一起的限制,所以每次接上一个a都要考虑一下前面的一个状态是否也是a。于是就可以使用\(f,g\)数组,\(f_i\)表示第\(i\)个字母是a的合法情况有多少,\(g_i\)表示第\(i\)个字母是b或c的合法......
  • P8907 [USACO22DEC] Making Friends P 题解
    P8907[USACO22DEC]MakingFriendsP题解我们考虑维护每个\(i\),在\(i\)的后面有多少个点和它有朋友关系。初步的想法是每删掉一个人就给集合里所有的点连边。但是我们发现这样太不优了,有很多边会重复连很多次。优化的想法是对于\(i\),删去之后连的边就成了一个完全图,于是......
  • [GYM103119K][2020 ICPC Asia Macau] Candy Ads 题解
    题意简述有\(n\)个广告,每个广告在一个时间段内占据二维平面的矩形,\(m\)个约束表示两个广告至少有一个要被选择,选择若干广告,满足所有约束且同时刻不能有重叠的广告。Kosaraju算法流程在正图上跑一遍DFS,给每个位置打上时间戳从时间戳大到小枚举点,在反图上跑DFS,这个时候对......