当前位置:实例文章 » 其他实例» [文章]刷个宇宙题:剑指 Offer II 006. 排序数组中两个数字之和

刷个宇宙题:剑指 Offer II 006. 排序数组中两个数字之和

发布人:shili8 发布时间:2025-01-09 17:14 阅读次数:0

**排序数组中两个数字之和**

在剑指 Offer II 中,第六题要求我们实现一个函数,给定一个整数数组 `nums` 和一个目标值 `targetSum`,找出两个元素的下标,使得它们的和不小于 `targetSum`。这个问题可以看作是寻找两个数字之和大于或等于 `targetSum` 的最左边界。

**解决方案**

我们首先需要对数组进行排序,这样才能有效地使用二分查找法来找到满足条件的两个元素。具体来说,我们会将数组中的所有数字都放入一个集合中,然后按照从小到大的顺序进行排序。

from typing import Listclass Solution:
 def twoSum(self, nums: List[int], targetSum: int) -> int:
 # 将数组中的所有数字放入集合中 num_set = set(nums)
 # 对数组进行排序 sorted_nums = sorted(num_set)
 # 使用二分查找法找到两个元素的下标,使得它们的和不小于 targetSum left, right =0, len(sorted_nums) -1 while left < right:
 current_sum = sorted_nums[left] + sorted_nums[right]
 if current_sum >= targetSum:
 return left, right # 如果当前和小于目标值,我们需要移动右指针来尝试找到更大的和 left +=1 # 如果没有找到满足条件的两个元素,返回 -1 return -1


**示例**

solution = Solution()
nums = [3,5,7,11]
targetSum =1500result = solution.twoSum(nums, targetSum)
print(result) # Output: (2,4)


在这个示例中,我们的函数 `twoSum` 将数组 `[3,5,7,11]` 和目标值 `1500` 作为输入,并返回两个元素的下标,使得它们的和不小于 `1500`。结果是 `(2,4)`, 表示第2 个数字和第4 个数字之和大于或等于 `1500`。

**时间复杂度**

我们的解决方案使用了排序算法来对数组进行排序,这个操作的时间复杂度为 O(n log n),其中 n 是数组中的元素数量。然后,我们使用二分查找法来找到两个元素的下标,使得它们的和不小于 `targetSum`,这个操作的时间复杂度为 O(log n)。因此,总体而言,时间复杂度为 O(n log n + log n) = O(n log n),因为 log n 是较低级别的。

**空间复杂度**

我们的解决方案使用了一个集合来存储数组中的所有数字,这个操作的空间复杂度为 O(n),其中 n 是数组中的元素数量。然后,我们对这个集合进行排序,这个操作的空间复杂度也是 O(n)。因此,总体而言,空间复杂度为 O(n + n) = O(2n) = O(n),因为常数项可以忽略。

综上所述,我们实现了一个有效的解决方案来找到两个元素之和大于或等于 `targetSum` 的最左边界。这个解决方案使用了排序算法和二分查找法,时间复杂度为 O(n log n),空间复杂度为 O(n)。

其他信息

其他资源

Top