Leetcode数组easy | 1.两数之和

(一)两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

Python版

解法一:两轮遍历。时间复杂度: O(N^2) 空间复杂度: O(1)

class Solution(object):
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i, j]

解法二:时间复杂度: O(N) 空间复杂度: O(N)

  • 建立字典 lookup 存放第一个数字,并存放该数字的 index
  • 判断 lookup 种是否存在: target - 当前数字, 则表面 当前值和 lookup中的值加和为 target.
  • 如果存在,则返回: target - 当前数字 的 index 和 当前值的 index
class Solution(object):
    def twoSum(self, nums, target):
        lookup = {}
        for i, num in enumerate(nums):   
            if target - num in lookup:
                return [lookup[target-num], i]
            else:
                lookup[num] = i

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中

  • seasons = ['Spring', 'Summer', 'Fall', 'Winter']
  • list(enumerate(seasons))
  • [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

C++版

方案一:时间复杂度: O(NlgN) 空间复杂度: O(N)

采用双指针法,先将数组排序形成了一个有序的区间,指针i,j分别指向头尾

  • 当 nums1[i] + nums[j] > traget 时,j--,
  • nums[i] + nums[j] < target 时,i++,
  • 直到 nums[i] + nums[j] == target
class Solution 
{
public:    # 关键字 public 确定了类成员的访问属性
    vector<int> twoSum(vector<int>& nums, int target)   # 返回值类型为vector<int>   函数参数有vector<int>类型和int
    {
        vector<pair<int,int> > nums1;   # 定义一个新容器
        for(int i = 0;i < nums.size();++i)   # size 当前使用数据的大小
            nums1.push_back(make_pair(nums[i],i));   # 将值和索引对添加进容器
        sort(nums1.begin(),nums1.end());  # sort  从小到大排序
        int i = 0,j = nums1.size() - 1;   # 头指针i 和尾指针 j 
        vector<int> ret;  # 定义新容器
        while(i < j)   # 根据指针条件循环
        {
            if(nums1[i].first + nums1[j].first == target)   # 判断指针对应容器nums1中的两个值的和
            {
                ret.push_back(nums1[i].second);   # 将符合条件的索引添加进容器ret
                ret.push_back(nums1[j].second);
                return ret;   # 返回容器
            }
            nums1[i].first +nums1[j].first < target ? ++i : --j;   # 问号运算 (表达式1)?(表达式2):(表达式3)  如果表达式1成立则执行表达式2,否则执行表达式3
        }
    }
};

方案二:时间复杂度: O(N) 空间复杂度: O(N)

c++中提供unordered_map 的容器,unordered_map 中的元素没有按照它们的键值或映射值的任何顺序排序, 而是根据它们的散列值组织成桶,以允许通过键值快速访问单个元素(具有常数平均时间复杂度) ,将先出现的元素储存在 unorder_map 中,遍历数组,每次查找 target - nums[i] 是否存在即可。

class Solution 
{
public:
   vector<int> twoSum(vector<int>& nums, int target)
   {
       unordered_map<int, int> m;  # 定义新容器m,类似于python的字典的键值对
       vector<int> res;   # 定义新容器res
       for (int i = 0; i < nums.size(); ++i) {
           m[nums[i]] = i;   # 将传入的nums元素添加进m,值作为键,索引作为值
       }

       for (int i = 0; i < nums.size(); ++i) {   # 遍历数组
           int t = target - nums[i];    
           if (m.count(t) && m[t] != i) {      # count() 如果m中存在为t的键,返回1。存在值t,且t的索引不为i
               res.push_back(i);     # 第一个索引添加进res
               res.push_back(m[t]);  # 满足条件的第二个索引添加进res
               break;
           }
       }
       return res;  # 返回向量容器类型
   }
};

参考:
awesome-algorithm
awesome-algorithm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容