返回顶部
首页 > 资讯 > 后端开发 > Python >python(leetcode)-1.两
  • 567
分享到

python(leetcode)-1.两

pythonleetcode 2023-01-30 23:01:21 567人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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

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

 看到这道题,不难理解,就是找出两个值的和等于特定值的下标。

笔者没有太多的想法,用python暴力法先实现一遍

上代码(未通过-超出时间限制)

 1 class Solution:
 2     def twoSum(self, nums, target):
 3         """
 4         :type nums: List[int]
 5         :type target: int
 6         :rtype: List[int]
 7         """
 8         result=[]
 9         for i in range(len(nums)):
10             for j in range( len(nums)):
11                 if(nums[i]+nums[j]==target and i!=j):
12                     result.append(i)
13                     result.append(j)
14                     break
15         aset=set(result)        #利用set无重复性消除重复添加
16         alist=list(aset)
17 
18         return alist
19 
20 if __name__=="__main__":
21     s=Solution()
22     nums=[3,2,4]
23     print(s.twoSum(nums,6))

分析原因:代码两层for循环,时间复杂度为O(n^2),所以遇到数据量大的情况耗时较久。

优化:上代码(通过-6800ms)击败20%

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        result=[]
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):   #第i个和第i个之后的数值进行求和对比
                if(nums[i]+nums[j]==target ): #取消了i和j的对比
                    result.append(i)
                    result.append(j)
                    break

        return result

if __name__=="__main__":
    s=Solution()
    nums=[3,2,4]
    print(s.twoSum(nums,6))

解释一下:

       两层for循环每一个和其他元素进行求和的过程中会出现,相同的数操作两遍的情况(比如i为下标3的数,j为下标6的数)当i和j的值互换(i=6,j=3)又求和进行操作,所以第二层循环再第i+1个开始,避免重复操作。这样理论可以提高50%的效率。但是时间复杂度依旧为O(n^2)。所以比较耗时。

之后怎么也想不到更好的方法,

所以借鉴评论区的大佬代码(通过-48ms)击败89%

 1 class Solution:
 2 
 3     def twoSum(self,nums,target):
 4         """
 5         :param nums:
 6         :param target:
 7         :return:
 8         """
 9         sort=sorted(range(len(nums)),key=lambda x:nums[x])
10         i=0
11         j=len(nums)-1
12         alist=[]
13         while(nums[sort[i]]+nums[sort[j]]!=target):  
14             if(nums[sort[i]]+nums[sort[j]]>target):  #当最大的元素和最小的元素相加大于目标值
15                 j-=1                                 #最大元素前移一个位置
16             else:                                    #小于目标值时
17                 i+=1                                 #最小元素后移一个位置
18         alist.append(sort[i])
19         alist.append(sort[j])
20         return alist
21 
22 if __name__=="__main__":
23     s=Solution()
24     nums= [2, 1, 3, 8, 4]
25     print(s.twoSum(nums, 6))

说下设计思想:(首尾递归查找)

首先第一部的排序有点技巧性,因为我们需要排序后才能首位递进查找,但是又需要返回排序前的下标。

所以根据list的值排序并且保存的是list的下标。这样就可以找到排序前的下标。

后面的代码比较简单,当和大于target时,最后一个位置向前移,当和小于target时,第一个位置向后移,

时间复杂度分析:

sorted()的复杂度为O(nlogn)

while()的复杂度为O(n)

所以复杂度为O(nlogn)  比之前的O(n^2)快了很多

 

然后在介绍一个更快的方法 先上代码(通过44ms)超过99%

 1 class Solution:
 2     def twoSum(self,nums,target):
 3         """
 4         :param nums:
 5         :param target:
 6         :return:
 7         """
 8         dit={}
 9         for index,num in enumerate(nums): #遍历值和下标
10             sub=target-num                
11             if(sub in dit):
12                 return [dit[sub],index]   #返回字典中的下标和index
13             dit[num]=index                #将num和index插入dit中
14         return None
15 if __name__=="__main__":
16     s=Solution()
17     nums= [2, 1, 3, 8, 4]
18     print(s.twoSum(nums, 4))

解释下设计思想:

利用字典可以存放key和value。根据与target的差值查找是否出现在字典中,如果有则返回下标,无则将index和num放入字典中并且遍历下一个,直到结束。

该方法for循环N次 减法操作1次,字典查询是否存在最优情况下是1次,字典赋值语句1次

总的复杂度为O(n) 所以该方法特别快

 

--结束END--

本文标题: python(leetcode)-1.两

本文链接: https://lsjlt.com/news/181148.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python(leetcode)-1.两
    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums ...
    99+
    2023-01-30
    python leetcode
  • Leetcode 1:两数之和
    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = ...
    99+
    2023-01-31
    之和 Leetcode
  • Java实现LeetCode(1.两数之和)
    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 示例: 给定 nums = [2, 7, 11, 1...
    99+
    2024-04-02
  • C++实现LeetCode(191.位1的个数)
    [LeetCode] 191.Number of 1 Bits 位1的个数 Write a function that takes an unsigned integer and r...
    99+
    2024-04-02
  • python 1
    用正则给ip对应的mac分割[root@room1pc01 桌面]# cat  ipmac.txt   192.168.4.5   121212452242   192.168.4.2   242426231251   192.168.4....
    99+
    2023-01-31
    python
  • python (1)
         1.解释型的,面向对象的,带有动态语义的高级程序设计语言。      2.使用Python    3.Python和c脚本的区别Python脚本  ** #coding:utf-8      设置编码格式c脚本    运行    ...
    99+
    2023-01-31
    python
  • Python(1)
    一、简介:1、Python语法简洁清晰,强制使用空格符作为语句缩进,来分割代码块。      Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。      Python...
    99+
    2023-01-31
    Python
  • Python------1
    封装:把同一功能的放一块。 继承:追根溯源。 类是对象的蓝图和模板,而对象是类的实例。 实例: claddname = Classesname 函数的写法: 如下图所示: 类: 如图所示: 在...
    99+
    2023-01-31
    Python
  • C++实现LeetCode(29.两数相除)
    [LeetCode] 29. Divide Two Integers 两数相除 Given two integers dividend and divi...
    99+
    2024-04-02
  • SQL实现LeetCode(175.联合两表)
    [LeetCode] 175.Combine Two Tables 联合两表 Table: Person +-------------+---------+ | Colu...
    99+
    2024-04-02
  • LeetCode如何实现两数之和
    小编给大家分享一下LeetCode如何实现两数之和,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目:给定一个整数数组 nums 和一个目标值 target,请你...
    99+
    2023-06-04
  • python[::-1][::-1,::-1]的具体使用
    目录一、 [::-1]二、 [::-1,::-1]一、 [::-1] import numpy as np import numpy as np x = np.arange(1, ...
    99+
    2024-04-02
  • python(leetcode)-283
    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少...
    99+
    2023-01-30
    python leetcode
  • python(leetcode)-344
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII...
    99+
    2023-01-30
    python leetcode
  • 详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
    [m : ] 代表列表中的第m+1项到最后一项 [ : n] 代表列表中的第一项到第n项 [-1] 代表去到最后一项 [:-1]代表除了最后一个都获取到 [::-...
    99+
    2024-04-02
  • LeetCode 数据库之组合两个表
    1. 题目 表1: Person ±------------±--------+| 列名 | 类型 |±------------±--------+| PersonId | int || FirstName | varchar || Las...
    99+
    2014-12-17
    LeetCode 数据库之组合两个表 数据库入门 数据库基础教程 数据库 mysql
  • python note #1
    To record my process of studying python and to practice my English meanwhile, I'd like to start write my blog about pyt...
    99+
    2023-01-30
    python note
  • Python Road 1
    利用博客来捋一遍Python的基础知识,看一看有没有遗漏的有趣的语法和知识,当然此博客也适用于入门小白,或许从某些方面来说比Python教程更能帮助到你。 一、Python环境: 二、列表和元组 列表和元组的主要区别在于,列表可以修改,...
    99+
    2023-01-30
    Python Road
  • zero python.1
    1.变量  2.流程控制  3.序列、字典、集合  4.文件  1.变量 程序中用来保存数据。定义时,不用指定变量类型,输出时使用print直接输出:>>> say = 'hello Python' >>>...
    99+
    2023-01-31
    python
  • opencv——python(1)
    导入opencv模块 import cv2 2.导入numpy模块 import numpy as np 3.读取当前目录图片 img = cv2.imread("1.jpg") 4.创建图像 emptyImage = ...
    99+
    2023-01-31
    opencv python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作