Python算法题----在列表中找到和为s的两个数字
2018-03-10 19:43
591 查看
列表data的值为[1, 3, 4, 5, 8, 9, 11],找出这个列表中和为13的两个数字的所有组合。这个好找,上过幼儿园大班的,估计都能找出来。4+9=13, 5+8=13。如何用python写一个函数来实现呢。解法一:超级大循环最容易想到的就是遍历啊。嵌套循环,外层循环遍历全部列表,内层循环遍历当前元素位置之后的所有元素。内层循环中将两个数字相加,等于13就break。妥妥找到。
解法二:首尾相加法因为data是升序排列的一个列表,我们可以用两个指针l, r指向列表的两端,那么data[l]+data[r]的和有3种情况:
1、等于S,那就将这两个数字添加的结果列表中,l指针右移,r指针左移2、小于S, 将l指针右移3、大于S, r指针左移
解法三:精准搜索法遍历data, 期待值 = S - data[i], 如果这个期待值在data[i]右面的剩余列表中,则找到,遍历万一遍,也就找到了所有的。
从时间复杂度上来说,解法一是时间复杂度最大的一个。解法三因为每次循环都要搜索剩余的列表,应该大于解法二。
单元测试
...----------------------------------------------------------------------Ran 3 tests in 0.000s
OK(4, 9)(5, 8)
def equalSum01(data=None, twosum=13): result = [] for i, vi in enumerate(data): if i + 1 > len(data) - 1: break for j, vj in enumerate(data[i+1:]): if vi + vj == twosum: print(vi, vj) result.append((vi, vj)) break return result
解法二:首尾相加法因为data是升序排列的一个列表,我们可以用两个指针l, r指向列表的两端,那么data[l]+data[r]的和有3种情况:
1、等于S,那就将这两个数字添加的结果列表中,l指针右移,r指针左移2、小于S, 将l指针右移3、大于S, r指针左移
def equalSum02(data=None, twosum=13): result = [] l = 0 r = len(data) - 1 while l < r: if data[l] + data[r] == twosum: result.append((data[l], data[r])) l += 1 r -= 1 elif data[l] + data[r] < twosum: l += 1 else: r -= 1 return result
解法三:精准搜索法遍历data, 期待值 = S - data[i], 如果这个期待值在data[i]右面的剩余列表中,则找到,遍历万一遍,也就找到了所有的。
def equalSum03(data=None, twosum=13): result = [] for i, v in enumerate(data): if (twosum - v) in data[i+1:]: result.append((v, twosum - v)) return result
从时间复杂度上来说,解法一是时间复杂度最大的一个。解法三因为每次循环都要搜索剩余的列表,应该大于解法二。
单元测试
import unittest class TestInverseMethods(unittest.TestCase): def test_equalSum01(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum01(data), result) def test_equalSum02(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum02(data), result) def test_equalSum03(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum03(data), result) if __name__ == ‘__main__‘: unittest.main()
...----------------------------------------------------------------------Ran 3 tests in 0.000s
OK(4, 9)(5, 8)
相关文章推荐
- Python算法题----在列表中找到和为s的两个数字
- 【算法------01】从某个数字列表中找出两个彼此最接近但不相等的数
- Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数
- 笔试算法题(18):常数时间删除节点 & 找到仅出现一次的两个数字
- Python查找两个有序列表中位数的方法【基于归并算法】
- 使用KNN算法在python下识别手写数字(带注释)
- python 列表转为字典的两个小方法
- 每天一道算法题-1 找出数组中两个只出现一次的数字
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
- Python之两个列表一起打乱
- Python:找到列表中满足某些条件的元素
- 算法题目---和为s的两个数字vs和为s的连续正数序列
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- python 两个列表转换字典
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- python比较两个列表大小的方法
- 已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个?
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- Python+sklearn使用支持向量机算法实现数字图片分类
- Python对象类型——数字对象类型/字符串对象类型/列表对象类型/字典对象类型等