数组-(sum close)找到数组中和与k最接近的3个数字

本文介绍了一个算法,用于在给定数组中找到三个数,使它们的和最接近于给定的目标值。通过排序和双指针技术,有效地解决了这个问题,并提供了Python实现代码示例。

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

class Solution:
    '''
    找到数组中结果与k接近的3个元素
    '''

    def threeSumClosest(self, numbers, target):
        # 排序
        numbers.sort()
        # 最接近的和
        ans = None
        # 结果列表
        res = []
        for i in range(len(numbers)):
            left, right = i + 1, len(numbers) - 1
            # 从i号位置开始搜索,i=0时搜索右边所有的,i=3时,不搜索0,1,2,因为0-3,1-3,2-3的组合前面已经搜索过了
            while left < right:
                sum = numbers[left] + numbers[i] + numbers[right]
                # 比较最近和
                if ans is None or abs(sum - target) < abs(ans - target):
                    ans = sum
                    res = [numbers[i], numbers[left], numbers[right]]
                # 因为已经从小到大排序
                if sum <= target:  # 小于target时尝试左边变得更大
                    left += 1
                else:  # 大于target时尝试右边变得更小
                    right -= 1
        return ans, res


s = Solution()
#和最接近1的
print(s.threeSumClosest([-1, 1, 2, -4, -1], 1))
#得出和为0的最接近
#(0, [-1, -1, 2])

 

问题描述 小蓝有一个长度为N的数组A = [A0,A1,…, AN-1]。现在小蓝想要从A对应的数组下标所构成的集合I=0,1,2,…, N-1 中一个子集 R1, 那么,在I中的补集为R2。记S1 = &sum;r∈R1 Ar, S2 = &sum;r∈R2 Ar,我们要求S1S2均为偶数,请问在这种情况下共有多少种不同的R1。当 R1或R2为空集时我们将S1或S2视为0。 输入格式 第一行一个整数T,表示有T组数据。 接下来输入T组数据,每组数据包含两行:第一行一个整数N,表示数组A的长度;第二行输入N个整数从左至右依次为A0,A1,…, AN-1,相邻元 素之间用空格分隔。 输出格式 对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你需要将答案对1000000007进行取模后输出。 样例输入 2 2 6 8 2 1 8 样例输出 4 0 样例说明 对于第一组数据,答案为4。(注意:大括号内的数字表示元素在数组中的下标。) R1 =0, R2 = 1;此时S1 =A0=6为偶数,S2 = A1 = 8为偶数。 R1 = 1, R2 = 0;此时S1 =A1=8为偶数,S2 =A0= 6为偶数。 R1=0,1, R2 =;此时 S1 = A0 + A1 = 6 + 8 = 14为偶数,S2 = 0为偶数。 R1 =, R2 = 0,1;此时S1=0为偶数 S2 = A0 + A1 = 6 + 8 = 14 为偶数。 对于第二组数据,无论怎么选择,都不满足条件,所以答案为0。 评测用例规模约定 对于20%的评测用例,1≤ N ≤10。 对于40% 的评测用例,1≤ N ≤10²。 对于 100% 的评测用例,1≤T≤10,1 ≤ N ≤ 10&sup3;, 0 ≤ Ai ≤ 10⁹ 接下来请你使用java完成我给你的算法题,要求如下(全程使用中文) 1. 全程使用中文 2.注意答题格式,请你将代码以如下形式呈现 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此输入您的代码… scan.close(); } } 3.再给出解答之后紧接着给出你的做题思路,让我看到你是如何思考的以此来开导我,注意解释仔细一点
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值