不重复打印数组中相加和为给定值的所有二元组和三元组

本文介绍了一种高效算法,用于在已排序的数组中寻找所有元素组合,其和等于给定值k。包括二元组和三元组的查找方法,采用双指针技术,避免重复解,适用于不降序数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目描述

给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组

例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:

1, 9

2, 8

解题方法

用左右两个指针不断向中间压缩的方式实现

n,k = list(map(int,input().split()))
arr = list(map(int,input().split()))

i,j = 0,len(arr)-1
#result = []
while i < j:
    if arr[i] + arr[j] ==k:
        #result.append([arr[i],arr[j]])
        print(arr[i],arr[j])
        while arr[i] == arr[i+1]:
            i +=1
        while arr[j] == arr[j-1]:
            j -= 1
    if arr[i] + arr[j] <k:
        i += 1
    else:
        j -= 1
#for res in result:
#    print(res[0],res[1])

        

2.题目描述

给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序三元组

例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:

-4 5 9
-3 4 9
-3 5 8
0 1 9
0 2 8
1 4 5

解题方法

n,target = list(map(int, input().split()))
arr = list(map(int, input().split()))
i = 0
result = []
while i < n-3:
    j = i + 1
    k = n-1
    temp = target-arr[i]
    while j < k:
        if arr[j] + arr[k] == temp:
#             result.append([arr[i],arr[j],arr[k]])
            print(arr[i],arr[j],arr[k])
            while arr[j] == arr[j+1]:
                j += 1
            while arr[k] == arr[k-1]:
                k -= 1
            j += 1
        elif arr[j] + arr[k] <temp:
            j += 1
        else:
            k -= 1
    while arr[i] == arr[i+1]:
        i += 1
    i +=1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值