题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素

举例

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路及难点

第一次刷数据结构相关的题目,老实说,内心还是有点小激动的。看到题目第一反应,就是暴力法,直接两个for循环就可以解决。

但想着还是要有点挑战才好,要把时间复杂度降到O(n)才有成就感。直觉应该要用到哈希表辅助才行。

分三种情况:

  • 两个数及它们的差都不同
  • 三个数中有两个相同
  • 三个数都相同

第一种解法我是先保存哈希,然后再对差是否在哈希中做判断,导致多了几个额外的判断逻辑,不够简洁。解法如下:

class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
record = {} for index,num in enumerate(nums):
diff = target - num if num in record:
l = record[num]
l.append(index)
record[num] = l
else:
record[num] = [index] if diff in record and record[diff][0]!=index:
return[record[diff][0],index]

第二种解决我是参考了Java的解法想到的,在Java中map中的key也是不能重复的(我原以为是可以的,真是低级错误!:),将先判断的逻辑提前,居然可以精减到只用6行代码解决。python果然是够方便的。

class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
record = {} for index,num in enumerate(nums):
diff = target - num if diff in record :
return[record[diff],index] record[num] = index

总结

小小的一道题目,原以为相对简单,一但有了性能上的要求,也花了我近1个半小时。看来理论知识再多,也还是需要手动敲代码啊。

通过手动编程,很多模糊的想法才能清晰起来。最好能先在纸上先列几个边界例子,手动算算。再将想法写成代码,一开始不用直奔简洁。

先通过单元测试,然后再考虑怎么把代码写得漂亮!

LeeCode第一次刷题(两数相加)的更多相关文章

  1. LeetCode刷题--两数相加(中等)

    题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  2. leetCode刷题 | 两数相加

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  3. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  4. leetCode刷题 | 两数之和

    两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  5. golang 算法题 : 两数相加

    package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func main() { l1 := ...

  6. leetcode 刷题(2)--- 两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  7. leetcode刷题2:两数相加add_two_numbers

    题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以 ...

  8. 【LeetCode每日一题 Day 2】2. 两数相加

    大家好,我是编程熊,今天是LeetCode每日一题的第二天,一起学习的是LeetCode第二题<两数相加>. 题意 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 ...

  9. 【leetcode】 算法题2 两数相加

      问题      给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

随机推荐

  1. 关于content-type请求头的说明

    Content-Type请求头的作用,用于标记请求体数据的格式,如: 1. Content-Type:application/x-www-form-urlencoded 请求体:b'pwd=123&a ...

  2. 五、MapReduce 发布服务

    是一个并行计算框架(计算的数据源比较广泛-HDFS.RDBMS.NoSQL),Hadoop的 MR模块充分利用了HDFS中所有数据节点(datanode)所在机器的内存.CUP以及少量磁盘完成对大数据 ...

  3. Oracle中按规定的字符截取字符串

    CREATE OR REPLACE FUNCTION "F_SPLIT" (p_str IN CLOB, p_delimiter IN VARCHAR2) RETURN ty_st ...

  4. 自定义UICollectionViewLayout并添加UIDynamic

    大家也可以到这里查看. UICollectionView是iOS6引入的控件,而UIDynamicAnimator是iOS7上新添加的框架.本文主要涵盖3部分: 一是简单概括UICollectionV ...

  5. python 输入一个整数,判断其是否既是3的倍数,又是5的倍数

    v = int(input('请输入一个整数:')) if v % 3 == 0 and v % 5 ==0: print(v,'即是3的倍数又是5的倍数') else: print('不是3或5的倍 ...

  6. 【JavaWeb】从零实现用户登录

    1.数据库预备 1.1 SQL 创建数据库 create database db; 创建表 create table userInfo( id int primary key , name ), pa ...

  7. 部署laravel项目

    1 先登录到服务器上,将代码克隆下来 git clone 项目地址 2 避免composer太慢,启用本镜像服务 可以先安装 apt-get install zip,unzip,php7.0-zip ...

  8. MapReduce之Map Join

    一 介绍 之所以存在Reduce Join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中.Reduce side join是非常低效的,因为shuf ...

  9. java并发(1)

    hashmap效率高单线程不安全,hashTable效率低但线程安全 因为hashTable使用synchronized来保证线程安全,所以效率十分低,比如线程1使用put插入数据时,线程2既不能使用 ...

  10. Flask后台管理

    管理后台主页 需求 为后台主页提供专门的视图函数 需要带入当前管理员用户相关信息以便在界面进行展示 代码实现 在 modules/admin/views.py 文件中添加视图函数 @admin_blu ...