鱼C论坛

 找回密码
 立即注册
查看: 47|回复: 1

[技术交流] 1. 两数之和

[复制链接]
发表于 昨天 17:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Gnomeshgh 于 2025-7-16 18:07 编辑

一、题目描述

给定一个整数数组 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 <= 104
-109 <= nums <= 109
-109 <= target <= 109
只会存在一个有效答案



二、解题思路

(一)暴力解法


最直观的方法就是穷举,对每一个数据进行两两相加,判断是否与目标值相等,相等则返回该下标。
微信图片_20250716170220.png
  1. class Solution:
  2.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  3.         # 第一个下标从0到倒数第二个
  4.         for i in range(len(nums) - 1):
  5.             # 第二个下标从i + 1 到倒数第一个
  6.             for j in range(i + 1 , len(nums)):
  7.                 # 与目标值一致则直接返回
  8.                 if nums[i] + nums[j] == target:
  9.                     return [i , j]
  10.         # 没有符合的就返回空
  11.         return []
复制代码

简单地优化一下,遍历的目的就是找到两数相加等于目标值,已知目标值,以及初始下标,相减即可得到需要找的值,可以直接用python中的count直接判断是否大于0即可,大于0则说明存在。还需注意的是一个值不能用两次,所以还要进行是否是自身的判断。
微信图片_20250716170220.png
  1. class Solution:
  2.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  3.         left = 0 # 记录起始下标
  4.         right = len(nums) # 记录终止下标
  5.         while left < right: # 当超出范围时结束循环
  6.             if nums.count(target - nums[left]) != 0: # 查询该列表中是否有相配对的数,有则不为0
  7.                 if left != nums.index(target - nums[left]):# 若这个数不是它本身则说明,找到了相配对的数
  8.                     return [left,nums.index(target - nums[left])]# 返回其对应得下标
  9.             left = left + 1 # 没有符合得就下标加1
  10.         return [] # 都没有符合得就返回空列表
复制代码

(二)哈希表法

哈希表非常适合查找类的题目,这个题目可以用思路二进行查找转换。
首先是创建哈希表,可以用enumerate进行创建,这样可以使值和下标同时存在且可以访问
微信图片_20250716170220.png
微信截图_20250716174828.png
  1. class Solution:
  2.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  3.         # 创建一个空集合,用于哈利表的存储
  4.         hash_map  = {}
  5.         # enumerate(nums),会转换为二元组,i取下标,num取值
  6.         for i,num in enumerate(nums):
  7.             # 判断目标值是否存在于哈希表中
  8.             if target - num in hash_map:
  9.                 return [i,hash_map[target - num]]
  10.             # 不存在则就向哈希表中添加元素,此时键为num,值为i,这样方便返回下标
  11.             hash_map[num] = i
  12.         # 都不存在则返回空
  13.         return []
复制代码


评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 C币 +3 收起 理由
不二如是 + 2 + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 19:01 | 显示全部楼层
不错!!欢迎分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-17 05:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表