当前位置: 首页> 汽车> 车展 > 广州东莞高坎疫情最新消息_石家庄规划_一个新产品的营销方案_站长工具网站备案查询

广州东莞高坎疫情最新消息_石家庄规划_一个新产品的营销方案_站长工具网站备案查询

时间:2025/7/9 3:40:36来源:https://blog.csdn.net/universehhh/article/details/146988359 浏览次数: 1次
广州东莞高坎疫情最新消息_石家庄规划_一个新产品的营销方案_站长工具网站备案查询
15、三数之和
# 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,
# 同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
# 注意:答案中不可以包含重复的三元组。
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""hashtable = dict()lst=[]for i, num in enumerate(nums):if target - num in hashtable:lst.append(sorted([target-num, num,-target]))          hashtable[num] = ireturn lstdef threeSum(self, nums):"""寻找数组中所有和为0的不重复三元组。:param nums: 输入的整数数组:type nums: List[int]:return: 返回所有满足条件的三元组列表:rtype: List[List[int]]"""# 使用哈希表统计每个数字出现的次数hashtable = dict()for num in nums:if num in hashtable:hashtable[num] += 1else:hashtable[num] = 1lst = []# 检查是否存在三元组 [0, 0, 0]if 0 in hashtable and hashtable[0] >= 3:lst.append([0, 0, 0])# 获取哈希表中的所有键,并排序以优化后续处理hashtable_key = list(hashtable.keys())hashtable_key.sort()# 将数字分为负数和正数两部分nums_negative = []nums_positive = []for num in hashtable_key:if num < 0:nums_negative.append(num)elif num > 0:nums_positive.append(num)# 检查是否存在三元组 [0, -num, num]if 0 in hashtable and hashtable[0] >= 1:for num in nums_positive:if -num in nums_negative:lst.append(sorted([0, -num, num]))# 检查是否存在三元组 [num1, num2, num3],其中 num1 + num2 + num3 = 0# 处理正数部分:如果某个正数出现两次或以上,则将其加入临时列表if len(nums_positive) != 0:lst_temp_positive = []for key in nums_positive:if hashtable[key] >= 2:lst_temp_positive.append(key)nums_positive += lst_temp_positive# 处理负数部分:如果某个负数出现两次或以上,则将其加入临时列表if len(nums_negative) != 0:lst_temp_negative = []for key in nums_negative:if hashtable[key] >= 2:lst_temp_negative.append(key)nums_negative += lst_temp_negative# 遍历负数列表,调用 twoSum 方法寻找与当前负数相加为零的正数对for num in nums_negative:lst_temp = self.twoSum(nums_positive, -num)lst += lst_temp# 遍历正数列表,调用 twoSum 方法寻找与当前正数相加为零的负数对for num in nums_positive:lst_temp = self.twoSum(nums_negative, -num)lst += lst_temp# 去重:将结果列表中的三元组转换为集合后再转回列表lst = list(map(list, set(map(tuple, lst))))return lst
Yes
No
开始
构建哈希表
是否有至少三个0?
添加 0, 0, 0
分类负数和正数
处理 0, -num, num
处理重复数字
遍历负数调用 twoSum
遍历正数调用 twoSum
去重结果
返回结果

问题分析与优化建议

1. 潜在问题
  • 异常处理不足:代码中没有对输入参数 nums 进行类型检查,如果传入的不是列表或包含非整数元素,可能会引发运行时错误。
  • 边界条件未充分考虑:当输入数组为空或长度小于3时,代码虽然不会报错,但可以更明确地处理这种情况。
  • 去重逻辑效率较低:当前使用 set(map(tuple, lst)) 去重的方式虽然有效,但会增加额外的时间和空间开销。
2. 优化方向
  • 输入验证:在函数开头添加对输入参数的类型和内容检查,确保输入为整数列表。
  • 边界条件优化:明确处理输入数组为空或长度小于3的情况。
  • twoSum 方法实现:提供一个高效的实现,避免重复计算。
  • 去重逻辑优化:通过排序和跳过重复值的方式减少不必要的计算,同时避免使用集合去重。
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""seen = set()  # 用于存储已经访问过的数字pairs = []for num in nums:complement = target - num  # 计算当前数字的补数if complement in seen:  # 检查补数是否已经在集合中pairs.append(sorted([complement, num]))  # 如果存在,添加到结果中seen.add(num)  # 将当前数字添加到集合中return pairsdef threeSum(self, nums):"""寻找数组中所有和为0的不重复三元组。:param nums: 输入的整数数组:type nums: List[int]:return: 返回所有满足条件的三元组列表:rtype: List[List[int]]"""# 输入验证if not isinstance(nums, list) or not all(isinstance(x, int) for x in nums):raise ValueError("输入必须是整数列表")# 边界条件处理if len(nums) < 3:return []# 对数组进行排序nums.sort()result = []# 遍历数组,寻找三元组for i in range(len(nums) - 2):# 跳过重复元素if i > 0 and nums[i] == nums[i - 1]:continue# 使用双指针寻找两数之和left, right = i + 1, len(nums) - 1while left < right:total = nums[i] + nums[left] + nums[right]if total == 0:result.append([nums[i], nums[left], nums[right]])# 跳过重复元素while left < right and nums[left] == nums[left + 1]:left += 1while left < right and nums[right] == nums[right - 1]:right -= 1left += 1right -= 1elif total < 0:left += 1else:right -= 1return result

优化点总结

  1. twoSum 方法优化:使用双指针方法替代哈希表方法,确保正确处理重复元素。
  2. 去重逻辑优化:通过排序和跳过重复值的方式减少不必要的计算,避免使用集合去重。
  3. 边界条件处理:确保代码在处理边界条件时逻辑正确。
关键字:广州东莞高坎疫情最新消息_石家庄规划_一个新产品的营销方案_站长工具网站备案查询

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: