当前位置: 首页 > news >正文

Leetcode1 两数之和 python两种方法实现

Leetcode1 两数之和 python两种方法实现

文章目录

    • Leetcode1 两数之和 python两种方法实现
      • 方法一:枚举法(暴力解法)
      • 方法二:用空间换时间。

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只会存在一个有效答案

分析:给定一个目标数值,需要返回和为目标数值的两个数的下标,而且答案只有一个。即对于a+b = target, 有且只有一个解。

方法一:枚举法(暴力解法)

对于一个数组[c1,c2,c3,c4,c5], 可以一组一组的判断,即(c1,c2),(c1,c3),(c1,c4),(c1,c5),

(c2,c3),(c2,c4),(c2,c5)

(c3,c4),(c3,c5),

(c4,c5)

即枚举法。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums) # 获取数组的长度
        for i in range(n):
          for j in range(i+1,n):
            if(nums[i]+nums[j] == target):
              return [i,j]
        return []
          

时间复杂度O(n^2), 空间复杂度O(1), 因为只使用了3个临时变量,n, i,j.

分析:时间复杂度很高,空间复杂度很低。如何能够降低时间复杂度,一种思路是用空间换时间

方法二:用空间换时间。

我们还是来看枚举法:

(c1,c2),(c1,c3),(c1,c4),(c1,c5),

(c2,c3),(c2,c4),(c2,c5)

(c3,c4),(c3,c5),

(c4,c5)

大部分时间花在了寻找第二个数上。有一个基本的观察是:如果第二个数与第一个数的和为目标数值,那么目标数值减去第二个数一定存在于数组中。

快速查找数值的结构是哈希集合或者哈希表,python中对应的结构是dict.

第一遍遍历的时候,如果当前数为答案中的第二个数,则target-当前数 则一定位于当前数之前的数组成的哈希集合中。
使用一个叫做dict的数据结构,键为数,值为当前数的索引。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashtable = dict()
        for i, num in enumerate(nums):
          if(target - num in hashtable):
            return [i, hashtable[target-num]]
          hashtable[num]= i

时间复杂度 O(n), 空间复杂度O(n)

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

链接:

https://leetcode.cn/problem-list/array/

从这一期leetcode开始,我会经常回来看我的博客,如果博主们觉得哪里看不懂,欢迎随时在评论区提出。

刷Leetcode就如同刷象棋路边摊一样,最开始刷的时候,觉得某一个象棋的路数好奇妙,刷着刷着回过头来看时发现那个招数在自己的眼中变得没那么令人惊讶了,变得稀松平常了。

相关文章:

  • 网站规划的一般步骤百度竞价怎么做效果好
  • wordpress很卡/seo专员工资一般多少
  • jsp是做网站后台的吗/百度推广客户端app
  • 南京500元做网站/百青藤广告联盟
  • 网站建设方案说明书/如何广告推广
  • 做一个色流网站怎么做/南宁seo网络推广
  • 基于SpringBoot的绿城郑州爱心公益网站设计与实现现(源码+SQL脚本+LW+部署讲解等)
  • ASP.NET MVC项目部署到IIS后,w3wp.exe程序报错重启
  • 【服务治理中间件】consul介绍和基本原理
  • 《玩转AI大模型:从入门到创新实践》(12)LLM初步(2)
  • C++ final和override
  • Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例
  • yarn application命令中各参数的详细解释
  • 物以类聚的Kmeans:数据分群的暴力美学
  • 知识库适配DeepSeek,企业微信支持自动登录,授权支持过期时间设置,zyplayer-doc 2.4.9 发布啦!
  • C语言:整数、浮点数在内存中的存储
  • AWS Glue用Python Shell从Workday系统将人力资源原始数据以Parquet格式存入S3
  • LVS+Keepalived高可用高性能负载实战
  • 【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
  • 计算机毕业设计SpringBoot+Vue.js企业OA管理系统(源码+文档+PPT+讲解)
  • Linux《基础开发工具(上)》
  • Java中的异常处理:选择try-catch还是try-with-resources?
  • 分布式性能压测
  • FREERTOS的三种调度方式
  • 微服务架构实践:SpringCloud与Docker容器化部署
  • 从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(七) 主题设置