leetcode刷题:两数之和

leetcode刷题:两数之和

题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
开始思路:
只是做出来,但是没有考虑只对应一个答案,两个for循环不容易解决重复问题,
 1 a = [2,4,6,3]
 2 b = 9
 3 def twoSum(nums, target):
 4     lens = len(nums)
 5     for i in range(lens):
 6         for j in range(i+1,lens):
 7             if nums[i]+nums[j] == target:
 8                print(i, j)
 9                break
10         break

这样在列表的第一个第二个值重复时候会出错

改正思路:只循环一个j,和值减去当前循环值去寻找差值,得到唯一性:

 1 a = [2,4,6,3]
 2 b = 9
 3 def twoSum(nums, target):
 4     lens = len(nums)
 5     for i in range(1, len(nums)):
 6         temp = nums[:i]
 7         if (target - nums[i]) in temp:
 8             j = temp.index(target - nums[i])
 9             print(j, i)
10 
11 
12 twoSum(a, b)

需要学习注意的是:

range 的范围是从0到i-1

列表的下标范围是从0开始对应元素

a[:1]表示a[0],列表的第一个元素

进一步学习:

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
enumerate(sequence, [start=0])
  • sequence — 一个序列、迭代器或其他支持迭代对象。
  • start — 下标起始位置。
 1 def two_sum(nums, target):
 2     """这样写更直观,遍历列表同时查字典"""
 3     dct = {}
 4     for i, n in enumerate(nums):
 5         #nums自动识别为字典,nums中下标为键,值为列表对应值
 6         cp = target - n
 7         #寻找和减去第一个的数的差值
 8         if cp in dct:
 9             print([dct[cp], i])
10         else:
11             dct[n] = i
12             #返回的一种写法
13 
14 
15 two_sum(a, b)

引申算法:哈希算法

 1 用字典模拟哈希求解
 2 字典记录num1和num2的值和位置
 3 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
 4 def twoSum(nums, target):
 5     hashmap={}
 6     #存储的内容是键值对(key-value)映射
 7     for ind,num in enumerate(nums):
 8         hashmap[num] = ind
 9     for i,num in enumerate(nums):
10         j = hashmap.get(target - num)
11         if j is not None and i!=j:
12             return [i,j]
最后两个引用出处
作者:lao-la-rou-yue-jiao-yue-xiang
链接:https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2771.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言三目运算符例子_单目运算符与双目运算符

    c语言三目运算符例子_单目运算符与双目运算符1.运算方向从左往右,从右往左结合,只有一个表达式被计算百度百科:三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,所以有时又称为三元运算符。一般来说,三目运算符的结合性是右结合的。对于条件表达式b?x:y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值…

    2022年9月28日
    2
  • Q学习(Q-learning)入门小例子及python实现

    Q学习(Q-learning)入门小例子及python实现一、从马尔科夫过程到Q学习#有一定基础的读者可以直接看第二部分Q学习(Q-learning)算法是一种与模型无关的强化学习算法,以马尔科夫决策过程(MarkovDecisionProcesses,MDPs)为理论基础。标准的马尔科夫决策过程可以用一个五元组<S,A,P,R,γ>表示,其中:S是一个离散有界的状态空间; A是一个离散的动作空间; P为状态转…

    2022年10月4日
    2
  • oracle字段换名语句,修改表名的sql语句

    oracle字段换名语句,修改表名的sql语句sql语句能不能修改表名可以。SQL自带了一系列的系统存储过程。其中sp_rename就具有修改表名和列名的功能。对于sp_rename是这样定义的:更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。基本语法:修改表名:EXECsp_rename'[原有表名]’,'[新表名]’;修改列名:EXECsp_rename'[原有列名]’,‘[新列名]’,’COLUMN’…

    2022年5月13日
    67
  • 协议和协定有什么区别_协议和合同是一回事吗

    协议和协定有什么区别_协议和合同是一回事吗1、https协议需要到CA(CertificateAuthority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http.

    2022年10月11日
    4
  • 俄语输入法键盘_汉字输入法

    俄语输入法键盘_汉字输入法隐马尔科夫模型隐马尔可夫模型(HiddenMarkovModel)是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来

    2022年8月1日
    5
  • java入门编程(菜鸟教程)

    java入门编程(菜鸟教程)1.创建一个java程序的步骤a打开editplus软件,选择左上角的file选项,在弹出来的菜单中选择new然后再从弹出来的菜单中选择normaltextb按住ctrl+s快捷键,保存。1选择要保存的位置2给文件命名(以大写的字母开头)3选择文件的后缀,以.java后缀结尾c进行代码的编写,所有字符我们必须都是英文输入状态下的d打开控制台(win+r在弹出左下角的命令行中输入cmd)e找到java源文件的位置,我们使用cd命令定位到我们源文件的文件夹(我们可以在打开的源文件文件夹地址栏

    2022年5月26日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号