C++ 4Sum - 查找和最接近的四元组2025年3月22日 | 阅读 12 分钟 4 Sum(查找和最接近的四元组)问题属于 k-Sum 问题类别,这些问题都与查找一组数字,使其总和等于目标值或接近目标值有关。在这里,问题是确定数组中的四个数字(一个四元组),它们的总和尽可能接近给定的特定数字。 为了解决这个问题,通常会实现有用的排序算法,例如排序和双指针方法,以降低时间复杂度。当数组被排序后,可以使用两个循环固定前两个数字,然后可以使用双指针技术轻松固定另外两个数字,最终使问题的复杂度等于 O(n^3)。排序后的数组有助于结构化地搜索组合,而双指针可用于根据当前四元组的总和来控制搜索过程,以查找接近目标总和的值。 目标是在优化总和的过程中,尽可能地接近目标。每当获得一个更接近目标的四元组总和时,它就会替换之前找到的。一旦找到等于目标的精确值,搜索就可以停止,因为不会有更好的解决方案。 这个问题是优化排序和双指针等技术以及在最高效的语言中实现解决方案的又一个好例子。这个问题还表明,在处理大型数据集时,应采用适当的数据结构和算法,而不会冒性能低下的风险。 方法一:暴力破解法暴力破解方法在解决 4 Sum 问题时可能很容易实现,但效率极低。在此方法中,会检查输入数组中任意 4 个元素相加的所有可能性,以找到最接近给定目标的正确组合。 程序让我们以一个示例说明使用 C++ 中的暴力破解法来解决 4 sum 问题。 输出 Input array: 1 2 -1 -4 -2 3 0 Target sum: 1 The closest sum to the target 1 is: 1 Input array: 5 3 2 7 8 10 -1 Target sum: 12 The closest sum to the target 12 is: 12 Input array: 0 0 0 0 Target sum: 0 The closest sum to the target 0 is: 0 Input array: 1 1 1 1 1 1 Target sum: 4 The closest sum to the target 4 is: 4 Input array: -1 2 1 -4 3 0 0 -2 Target sum: 1 The closest sum to the target 1 is: 1 说明
函数 fourSumClosest
嵌套循环
最接近的总和计算
输入显示函数
测试函数
复杂度分析时间复杂度 此暴力破解方法的时间复杂度确定为 O(n^4)。此复杂度源于用于遍历数组的四个嵌套循环。
在这方面,由于每个循环都依赖于其他循环,因此正在评估的组合数量是输入数组大小的多项式,特别是四阶多项式。因此,迭代次数随着输入大小的增加而增加,这对于大型数据集来说是一个关键问题,并且会严重降低执行速度。 空间复杂度 此方法的空间复杂度为常数 O(1)。这意味着算法除了输入数组所需的空间外,还需要恒定的额外空间。indices_alloc、current_sum 和 best_sum 变量用于存储索引、当前总和和最佳总和,并且这些变量不会随着输入大小的增加而增加。因此,该算法不需要与输入大小成比例的空间复杂度的辅助数据结构,因此内存效率很高。 方法二:排序和双指针技术优化并选择双指针方法是 4 Sum(查找和最接近的四元组)问题的良好解决方案。与上述使用暴力破解排序方法和双指针方法相比,此方法将时间复杂度降低了一半。 程序让我们以一个示例说明使用 C++ 中的排序和双指针技术来解决 4 sum 问题。 输出 Input array: 1 2 -1 -4 -2 3 0 Target sum: 1 The closest sum to the target 1 is: 1 Input array: 5 3 2 7 8 10 -1 Target sum: 12 The closest sum to the target 12 is: 12 Input array: 0 0 0 0 Target sum: 0 The closest sum to the target 0 is: 0 Input array: 1 1 1 1 1 1 Target sum: 4 The closest sum to the target 4 is: 4 Input array: -1 2 1 -4 3 0 0 -2 Target sum: 1 The closest sum to the target 1 is: 1 说明
复杂度分析时间复杂度
空间复杂度
下一主题C++ 中的移动到前面算法 |
优化问题在科学、工程和技术领域无处不在。从设计高效的电路到规划运输路线,优化解决方案是一项基本任务,需要强大的算法。然而,许多现实世界的优化问题是非线性的、复杂的,并且充满了局部最优解,这使得...
阅读 13 分钟
地下城游戏是世界上最古老的类型之一,玩家需要穿越地下城式的区域,与敌人作战,收集物品,解决谜题,最终达到击败最终 Boss 或逃离地下城的目的。该类型也很容易...
阅读 8 分钟
在本文中,我们将讨论 C++ 和 Prolog 之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 和 Prolog 及其主要功能。什么是 C++?C++ 是由 Bjarne Stroustrup 于 1983 年开发的高性能通用语言,扩展了 C 语言...
7 分钟阅读
在本文中,我们将讨论 C++ 中的二维网格移位及其示例。引言:在 C++ 中,移动二维网格意味着将其每个组件沿预定方向(垂直或水平)移动。许多计算任务,包括图像处理、矩阵操作和基于网格的算法,经常...
5 分钟阅读
简介:备忘录模式是一种行为设计模式,用于捕获对象的内部状态并将其外部化,以便以后可以恢复到该状态而不违反封装。当您需要实现撤销机制、检查点时,此模式特别有用……
阅读 10 分钟
一种称为格约简的数学技术,用于数值分析、计算几何和密码学,以在高维环境中处理格。在数学中,格是由一组基向量的整数组合组成的欧几里得空间网格状结构。约简格的……
7 分钟阅读
简介:C++ 中的“会议室”问题是确定一个人是否可以在不发生冲突的情况下参加所有安排的会议。每个会议都用一个时间间隔表示,包含开始和结束时间,目标是检查会议是否在任何方面发生冲突。假设……
阅读 13 分钟
FIFO 推送-重叠算法是解决网络流优化中最大流问题的有效方法。该算法是推送-重叠算法的一个变体,旨在确定可以从...从网络发送的最大流量。
阅读9分钟
模板方法模式是面向对象编程中一种众所周知的行为设计模式,它用于定义算法的整体结构或骨架,允许派生类通过自定义算法的某些步骤来定制算法,而无需更改步骤的顺序……
阅读9分钟
自传数(n)是指定基数中的一个 b 位整数。在该数中,位置 p(其中最高有效位是位置 0,最低有效位是位置 (b−1))处的每个数字反映了该数字出现的次数...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India