用C++解决寻找黄金分割点问题:附代码与详细解释
以下是解决该问题的C++代码: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n; // 读取整数 n,表示数组的长度 cin >> n; vector<int> a(n + 1); // 前缀和数组,用于存储到每个位置的元素总和 vector<int> prefix_sum(n + 1, 0); // 读取数组元素,并计算前缀和 for (int i = 1; i <= n; ++i) { cin >> a[i]; prefix_sum[i] = prefix_sum[i - 1] + a[i]; } // 遍历数组,寻找黄金分隔点 for (int i = 1; i <= n; ++i) { // 计算左侧元素的总和 int left_sum = prefix_sum[i - 1]; // 计算右侧元素的总和 int right_sum = prefix_sum[n] - prefix_sum[i]; // 判断左侧元素总和是否等于右侧元素总和的两倍 if (left_sum == 2 * right_sum) { cout << i << endl; return 0; } } // 如果未找到符合条件的分割点,输出 -1 cout << -1 << endl; return 0; } ``` ### 代码解释: 1. **输入处理**:首先读取整数 `n`,表示数组的长度。然后读取 `n` 个整数,存储在数组 `a` 中。 2. **前缀和计算**:使用 `prefix_sum` 数组来计算从数组开头到每个位置的元素总和。这样可以在 $O(1)$ 的时间复杂度内计算任意区间的元素和。 3. **寻找黄金分隔点**:遍历数组,对于每个位置 `i`,计算其左侧元素的总和 `left_sum` 和右侧元素的总和 `right_sum`。如果 `left_sum` 等于 `right_sum` 的两倍,则 `i` 是黄金分隔点,输出 `i` 并结束程序。 4. **未找到分隔点的处理**:如果遍历完整个数组都没有找到符合条件的分割点,输出 `-1`。 ### 复杂度分析: - **时间复杂度**:$O(n)$,主要是因为需要遍历一次数组来计算前缀和,再遍历一次数组来寻找黄金分隔点。 - **空间复杂度**:$O(n)$,主要是因为需要使用一个长度为 `n` 的前缀和数组。 ######[AI问答 | 595点数解答 | 2026-08-29 20:24:30]
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)402
- C3期末:精准求解 3 - 20 范围内数列第 k 项值及注意要点(字节豆包 | 242点数解答 | 2025-06-15 11:26:19)235
- C++求解:查找3 - 20项数列第k项值及注意要点(字节豆包 | 325点数解答 | 2025-06-15 11:27:11)266
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)383
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)392
- 求解 1 至 n 内第 k 大孤独数:质数与余数的巧妙探寻(字节豆包 | 298点数解答 | 2025-11-10 20:01:57)272
- 巧判小朋友同桌意愿:满足需求还是无解难题?(字节豆包 | 599点数解答 | 2025-11-16 20:06:12)154
- 巧用代码判断:能否让 2n 个小朋友都拥有满意同桌?(字节豆包 | 445点数解答 | 2025-11-16 20:07:02)159
- C++实现计算家庭公园门票最少花费的方法与开发建议(字节豆包 | 586点数解答 | 2026-08-10 20:30:16)21
- 破解Jenkins构建Java项目“数据收集等待过长”难题的实用攻略( | 389点数解答 | 2024-01-18 09:27:30)398
- Jenkins 构建 Java 项目“数据收集等待过长”难题的 10 大解决策略(百度文心 | 551点数解答 | 2024-01-18 09:27:54)357
- C++ 求解整数减少至 0 使奇数次数最少的最小纠结次数问题(字节豆包 | 229点数解答 | 2024-08-21 16:33:58)322