LeetCode_1. 两数之和

题目

image.png

https://leetcode-cn.com/problems/two-sum/

思路

1. 暴力破解

  • 思路分析

本质上,就是先取一个数 num ,然后判断 target-num 这个数在剩下的数中是否存在。
需要避免重复的比较:当取第一个数的时候,需要与剩下的所有数进行比较,之后取第二个数,则不需要再和第一个数相比,此时可以认为第一个数的比较工作已经结束了。

  • 代码实现

    1. class Solution:
    2. def twoSum(self, nums: List[int], target: int) -> List[int]:
    3. length=len(nums)
    4. for i in range(length):
    5. for j in range(i+1,length):
    6. if nums[i]+nums[j]==target:
    7. return [i,j]
  • 时间和空间消耗

image.png
结果表明,其实还好,没有想到暴力破解还能击败50%以上的用户。

2. 使用字典

  • 思路分析

注意到使用字典的思路,是逐步扩充所谓“剩下的数”这个集合,其本质上和暴力破解的思路一致,只是顺序上是相反的,值得学习。

  • 代码实现

    1. class Solution:
    2. def twoSum(self, nums: List[int], target: int) -> List[int]:
    3. dic={}
    4. for index,num in enumerate(nums):
    5. if dic.get(target-num) is not None:
    6. return [index,dic.get(target-num)]
    7. dic[num]=index
  • 时间和空间消耗

image.png

小白 Python 几种解

LeetCode_167.两数之和 II

题目

image.png

https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/

思路

1. 暴力破解

  • 思路分析

相比 LeetCode_1. 两数之和 而言,强调了升序排列,故而在 LeetCode_1. 两数之和 的暴力破解的方法基础之上,增加了一个条件语句,用于避免没有必要的搜索,具体的说,就是在 numbers 列表中迭代到比 target-num 还要大的数时,直接 break,具体见代码实现。

  • 代码实现

    1. class Solution:
    2. def twoSum(self, numbers: List[int], target: int) -> List[int]:
    3. length=len(numbers)
    4. for index,num in enumerate(numbers):
    5. for j in range(index+1,length):
    6. t=target-num
    7. if numbers[j]>t:
    8. break
    9. if numbers[j]==t:
    10. return [index+1,j+1]
  • 时间和空间消耗

image.png
时间和空间的消耗都太大了…程序的效率不是很高。

2. 使用双指针

  • 解题思路

两数之和 II - 输入有序数组 - 双指针 O(N) 时间复杂度 # 上面已经说的很完美易懂了。
认识到了,如果在有序的列表中,可以考虑双指针来解决问题。
认识到了,一个大佬 cyc 。

  • 代码实现

    1. class Solution:
    2. def twoSum(self, numbers: List[int], target: int) -> List[int]:
    3. length=len(numbers)
    4. i=0
    5. j=length-1
    6. while i<j:
    7. if target<numbers[i]+numbers[j]:
    8. j=j-1
    9. elif target>numbers[i]+numbers[j]:
    10. i=i+1
    11. else:
    12. return [i+1,j+1]

    注意:从概率上来讲,数组的首尾两个值的和刚好等于 target 的概率远低于不等于的情况,所以将 == 的情况放到else里效率应该会更高。

  • 时间和空间消耗

image.png
比暴力破解法稍有提升。