返回

1237. 找出给定方程的正整数解

前端

问题

给定一个方程 a * x + b * y = c,其中 abc 均为正整数。请找出所有满足该方程的正整数解 (x, y)

解题思路

我们可以使用二分查找法来解决此问题。二分查找法是一种非常高效的搜索算法,它能够快速找到有序数组中的某个元素。

在二分查找法中,我们将搜索范围不断缩小,直到找到目标元素或确定目标元素不存在。具体步骤如下:

  1. 将搜索范围初始化为 [1, c]
  2. 计算搜索范围的中间值 m
  3. 计算方程 a * x + b * m = c 的值,记为 v
  4. 如果 v = c,则说明找到了一个满足方程的正整数解 (m, (c - a * m) / b)
  5. 如果 v < c,则说明满足方程的正整数解 x 必须大于 m,因此将搜索范围缩小为 [m + 1, c]
  6. 如果 v > c,则说明满足方程的正整数解 x 必须小于 m,因此将搜索范围缩小为 [1, m - 1]
  7. 重复步骤 2-6,直到找到所有满足方程的正整数解或确定方程没有正整数解。

详细代码实现

class Solution {
public:
    vector<vector<int>> findSolution(int a, int b, int c) {
        vector<vector<int>> res;
        int left = 1, right = c;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            int v = a * mid + b;
            if (v == c) {
                res.push_back({mid, (c - a * mid) / b});
                left = mid + 1;
            } else if (v < c) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return res;
    }
};

复杂度分析

二分查找法的复杂度为 O(log c),其中 c 是方程 a * x + b * y = c 中的常数项。

总结

二分查找法是一种非常高效的搜索算法,它能够快速找到有序数组中的某个元素。我们可以使用二分查找法来求解各种问题,包括 LeetCode 1237: 找出给定方程的正整数解。