问题出在第三层循环中,每次都需要判断k是否等于i或j,这样会导致重复计算。另外,在第二层循环中,j应该从i+1开始,因为不需要重复计算已经被计算过的组合。
正确的代码如下:++#include <iostream>#include <vector>using namespace std;int main(){ int n; int count = 0; cin >> n; if (n == 1 or n == 2) { cout << 0; return 0; } vector<int> nums; int num; for (int i = 1; i <= n; i++) { cin >> num; nums.push_back(num); } for (int i = 0; i < nums.size(); i++) { for (int j = i + 1; j < nums.size(); j++) { for (int k = j + 1; k < nums.size(); k++) // 注意是从j+1开始 { if (nums[i] + nums[j] == nums[k]) { count++; } } } } cout << count; return 0;}
此外,可以针对题目条件进行优化。如果将数列按升序排序,那么对于每个数num,只需要在比它大的数中查找是否有两个数的和等于它即可,这样可以避免重复计算。
优化后的代码如下:++#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ int n; int count = 0; cin >> n; if (n == 1 or n == 2) { cout << 0; return 0; } vector<int> nums; int num; for (int i = 1; i <= n; i++) { cin >> num; nums.push_back(num); } sort(nums.begin(), nums.end()); // 排序 for (int i = nums.size() - 1; i >= 0; i--) { int left = 0, right = i-1; // 双指针初始化 while (left < right) { if (nums[left] + nums[right] == nums[i]) { count++; break; } else if (nums[left] + nums[right] < nums[i]) { left++; } else { right--; } } } cout << count; return 0;}
希望这些修改能够帮助您解决问题。
球一个最佳答案谢谢啦!这对我非常重要! |