可以使用双指针的方法来解决这个问题。

首先,我们可以先生成一个三角形数的数组,数组中的每个元素都是一个三角形数。可以使用一个循环来计算每个三角形数,直到超过给定的最大值x为止。

接下来,我们使用双指针的方法,从数组的两端开始遍历,判断两个指针指向的元素之和是否等于x。如果等于x,则返回true;如果小于x,则将左指针右移一位;如果大于x,则将右指针左移一位。直到两个指针相遇为止。

如果循环结束后仍然没有找到满足条件的两个三角形数之和等于x,则返回false。

下面是相应的C++代码实现:

#include <iostream>
#include <vector>
using namespace std;

bool isTriangleNumber(int x) {
    vector<int> triangleNumbers;
    int n = 1;
    while (true) {
        int triangleNumber = n * (n + 1) / 2;
        if (triangleNumber > x) {
            break;
        }
        triangleNumbers.push_back(triangleNumber);
        n++;
    }

    int left = 0;
    int right = triangleNumbers.size() - 1;
    while (left <= right) {
        int sum = triangleNumbers[left] + triangleNumbers[right];
        if (sum == x) {
            return true;
        } else if (sum < x) {
            left++;
        } else {
            right--;
        }
    }

    return false;
}

int main() {
    int x;
    cin >> x;
    if (isTriangleNumber(x)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
    return 0;
}

这个算法的时间复杂度为O(sqrt(x)),可以在给定的时间限制内解决问题


原文地址: https://www.cveoy.top/t/topic/h63F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录