要求
返回一个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