#!/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]]

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐