返回list数组中两个数和为0的组合 Python实现
#!/usr/bin/env python# -*- coding: utf-8 -*-# @File: ali.py# @Author: LiZhigen# @Date: 2018/6/29# @Desc:[-1,0,1,5,2,-4,4,9,0,-8,-9]返回[[9, -9], [4, -4], [1, -1], [0, 0]]# 思路:# 1、将数组元素排...
·
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : ali.py # @Author: LiZhigen # @Date : 2018/6/29 # @Desc :[-1,0,1,5,2,-4,4,9,0,-8,-9] 返回[[9, -9], [4, -4], [1, -1], [0, 0]]
# 思路: # 1、将数组元素排序; # 2、array[i]与a[j](j的取值:i+1到len_array-1) 相加; # 3、如两两相加<整数继续,如=整数则输出元素值; # 4、如>则直接退出,i+1 开始下一轮相加比较 class Solution(object): def twoSum(self,nums,target): temp_array = nums temp_sumdata = target sorted(temp_array) len_temp_array = len(temp_array) # 计数符合条件的组数 num = 0 listresult=[] for i in range(0, len_temp_array - 1): for j in range(i + 1, len_temp_array): if temp_array[i] + temp_array[j] < temp_sumdata: continue elif temp_array[i] + temp_array[j] == temp_sumdata: num += 1 listresult.append([temp_array[i],temp_array[j]]) else: break return listresult # 增加空间复杂度,采用双端队列实现,将排序后的list转换为双端队列[5,4,2, 0, 1, -1,-4],循环出队列最左边元素与最右边元素,并比较 # 如果最左边元素与右边的和与给定值相等则添加到结果list中,即当前最左边元素和最右边元素都出队列 # 如果最左边元素与右边的和大于给定值,则说明最左边元素太大了,向右移动寻找更小的,即当前最左边元素出队列,最右边元素又回到队列 # 如果最左边元素与右边的和小于给定值,则说明最右边元素太小了,向左移动寻找更大的负数,即当前最左边元素又回队列,最右边元素出队列 from collections import deque class Solution2(object): def twoSum(self,nums,target): temp_array = nums temp_sumdata = target resultlist=[] temp_array.sort(reverse=True) stacklist= deque(temp_array) flag=True while (flag): if len(stacklist)==0: break left=stacklist.popleft() if len(stacklist)==0: break right=stacklist.pop() if left + right == temp_sumdata: resultlist.append([left,right]) elif left + right > temp_sumdata: stacklist.append(right) continue elif left + right < temp_sumdata: stacklist.appendleft(left) if left <=0: flag=False return resultlist if __name__ == "__main__": test_array = [-1,0,1,5,2,-4,4,9,0,-8,-9] test_sumdata = 0 a=Solution2() print(a.twoSum(test_array,test_sumdata))
结果
[[9, -9], [4, -4], [1, -1], [0, 0]]
更多推荐
已为社区贡献3条内容
所有评论(0)