Python-three number sum-返回一个list中,sum为目标值的三元数组(升序排列)的所有情况。

要求

返回一个list中,sum为目标值的三元数组(降序排列)的所有情况。

样例:

输入

arr_input = [12, 3, 1, 2, -6, 5, -8, 6]
target = 0

输出:

[[-8, 2, 6], [-8, 3, 5], [-6, 1, 5]]

思路:

要从一个数组中选出和为定值的所有三维数组的集合,并升序排列输出。

一开始想到使用三个for循环,并在最里层使用判断语句,这样程序的时间复杂度为O(n^3),太高。

优化的方法:

1:先对数组进行排序(升序)

2:设置下标_ = 0 为current_value,这个值会从第0个下标一直运动到倒数第三个位置。(最后两个位置留给prior 和 rear)

3: 设置prior 下标为 _+1, rear下标为len(array)-1

4: 此时三个下标对应的数组array中的值的和即为当前组合的sum

5:如果当前值符合目标值,将当前组合append到记录数组[] 中

6:如果当前组合的sum小于目标,prior向右移动一位,否则rear向左移动一位。

7:如果prior和rear的位置发生交换,本次循环结束,current_value下标向右移动一位

优化后算法的time complexity为O(n^2)

二者的space complexity都为O(n)

def threeNumberSum(array, targetSum):
    # sort the array
    array = sorted(array)
    # print(array)
    length_of_array = len(array)

    # def sum_three(num1 = array[prior],num2 = array[middle],num3 = array[rear]):
    # 	return num1+num2+num3
    
    arr_to_return = []
    for _ in range(length_of_array-2):

    	prior = _+1
    	rear = length_of_array-1
    	while rear>prior:
    		current_sum = array[_]+array[prior]+array[rear]
    		if current_sum==targetSum:
    			arr_to_return.append([array[_],array[prior],array[rear]])
    			prior += 1
    			rear -= 1
    		elif current_sum<targetSum and prior<length_of_array:
    			prior += 1
    		elif current_sum>targetSum and rear > 0:
    			rear -= 1 
    # arr_to_return.append(sum_three())

    return arr_to_return

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值