解法一:
超级大循环
最容易想到的就是遍历啊。嵌套循环,外层循环遍历全部列表,内层循环遍历当前元素位置之后的所有元素。内层循环中将两个数字相加,等于13就break。妥妥找到。
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