LeetCode_1. 两数之和
写在前面
难度:简单
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
1. 遍历列表,因为返回的是元素的索引就可以通过enumerate来记录
2. 找到第一个元素,就去找这个元素与目标的差,如果在(余下的列表中)就返回2个元素的索引
3. 依次循环做到最后第二个即可(但其实这个无需你处理)
但是要注意几点
1. 这个数不能用两遍,意味着只能在排除了当前数,(往后面)余下的列表中去找
2. 返回的是2的数的索引,还是在余下的表中找出来的索引,但要加上自己之前的索引信息
3. 默认是一定是能找到的,不用考虑找不到的情况
我的代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i,v in enumerate(nums): #思路1.
if target-v in nums[i+1:]: #思路2.
return [i,nums[i+1:].index(target-v)+i+1] #注意2.
分析
由于主要用的是list,耗时和内存比较大,可以考虑用字典
参考代码:用字典的思路1
1. 将nums中的索引和值构造成一个字典
2. 遍历列表,如果target-v的差值在字典中,且索引号不同就返回
注意点:
1. 为何是索引号不同就返回呢,如果索引号相同的话,就是同一个数,那对于偶数target,如果target/2在里面只有一个就有问题了。
2. 由于要对索引号进行比较,一般用key来取value,那么我们应该把nums中的index作为value,列表中元素的值是key
3. 基于2,列表中的值做key的话,可能会重复,导致后面的覆盖前面的,但是我们要明白,如果重复的值是结果的话,我们要得到的就是2个数据的索引,第一个值应该在nums中,第二个值在构造的字典中,是没有问题的。
class Solution:
def twoSum(self, nums: list, target: int) -> list:
dict_nums = { v:i for i,v in enumerate(nums)}
for i,v in enumerate(nums):
if target-v in dict_nums and dict_nums[target-v]!=i:
return [i,dict_nums[target-v]]
参考代码:用字典的思路2
字典其实可以不先构造好。
可以遍历列表,如果当前数与target的差在字典中,就返回当前值的索引和字典中已有数据对应的value,否则就放入字典中待用。
class Solution:
def twoSum(self, nums: list, target: int) -> list:
dict_nums ={}
for i,v in enumerate(nums):
if target-v in dict_nums:
return [dict_nums[target-v],i]
else:
dict_nums[v]=i
最佳内存分配
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
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^2)
对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)
空间复杂度:O(1)用字典的思路1
时间复杂度:O(n)
我们把包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n) 空间复杂度:O(n)
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。用字典的思路2
时间复杂度:O(n)
我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。 空间复杂度:O(n)
所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素
LeetCode_1. 两数之和的更多相关文章
- 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...
- LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$
Design and implement a TwoSum class. It should support the following operations: add and find. add - ...
- LeetCode 371. Sum of Two Integers (两数之和)
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...
- LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- [LeetCode] 1. Two Sum 两数之和
Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...
- Leetcode(一)两数之和
1.两数之和 题目要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重 ...
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- 两数之和,两数相加(leetcode)
我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...
- leetcode刷题--两数之和(简单)
一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...
随机推荐
- Linux系统安装python
1. 安装python3 1.1 下载python3安装包及其依赖包(该步骤可忽略,步骤1.2 提供应用包链接) ① 在python官网下载所需的python3,或者用外网centos机器的wget命 ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
- 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
本文已收录到 GitHub · AndroidFamily,有 Android 进阶知识体系,欢迎 Star.技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群. 前言 大家好 ...
- 两行CSS让页面提升了近7倍渲染性能!
前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载过慢,你的用户很可能会因此离你而去.所以页面性能对于前端开发者 ...
- 关于python转义字符在正则匹配中的问题研究
问题 首先看一个问题: import re text = r"\学" print(text) zz = r"\学" result = re.findall(zz ...
- 关于js更改编码问题
前言 前几天调试喜马拉雅的js加密算法,找到固定一段加密算法后调试,发现结果与实际不一致,后来发现是js显示的编码不一致,而我用的密钥是直接通过 chrome控制台复制下来的,这就导致最后结果不一致. ...
- [数学建模]主成分分析法PCA
最常用的线性降维方法,通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性. Q1:为何选取方差 ...
- python连接MySQL数据库实现(用户登录测试功能)pymysql
pymysql PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务.存取过程.批量执行,实现增删改查等 # 注册 def register(cursor): usern ...
- git相关问题解析,你想要的都有🔥
官网文档: https://git-scm.com/doc 本地克隆远程代码仓库 git clone 地址 本地同步全量历史数据,克隆所有文件的历史记录 git clone 地址 -depth 1 本 ...
- day06-功能实现05
家居网购项目实现05 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 12.功能11-后台分页(分页显示家居) 12.1需求分析 ...