2024-03-14 leetcode寫題記錄

FlyingLight發表於2024-03-15

目錄
  • 2024-03-14 leetcode寫題記錄
    • 829. 連續整數求和
      • 題目連結
      • 題意
      • 解法

2024-03-14 leetcode寫題記錄

829. 連續整數求和

題目連結

829. 連續整數求和

題意

給定一個正整數\(n\),返回連續正整數滿足所有數字之和為\(n\)的組數。

示例 1:

輸入: n = 5
輸出: 2
解釋: 5 = 2 + 3,共有兩組連續整數([5],[2,3])求和後為 5。
示例 2:

輸入: n = 9
輸出: 3
解釋: 9 = 4 + 5 = 2 + 3 + 4
示例 3:

輸入: n = 15
輸出: 4
解釋: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5

解法

連續正整數之和,可以寫為\(n = \frac{r(r+1)}{2} - \frac{l(l+1)}{2}\),兩邊乘\(2\),可得

\( \begin{align} 2n &= r(r+1) - l(l+1) \nonumber \\ &= r^2 + r - l^2 - l \nonumber \\ &= (r + l + 1)(r - l) \nonumber \end{align} \)

由於以下性質:

(1)\(r+l+1\)\(r-l\)的乘積為\(2n\)

(2)\(r+l+1\)\(r-l\)奇偶性不同;

(3)\(r+l+1\)嚴格大於\(r-l\)

(4)任何兩個奇偶性不同的正整數\(r+l+1\)\(r-l\),都一定有自然數\(r\)\(l\)與其一一對應(證明很簡單,列下方程組就行)。

所以我們只需要遍歷\([1,\sqrt{2n})\),求出能整除\(2n\),且\(2n / i\)\(i\)奇偶性不同的\(i\)的個數就行。

時間複雜度顯然為\(O(\sqrt{n})\)

class Solution {
public:
    int consecutiveNumbersSum(int n) {
        int cnt = 0;
        for (int i = 1; 1ll * i * i < 2 * n; ++i)
            if (2 * n % i == 0 && (i ^ (2 * n / i)) & 1)
                cnt++;
        return cnt;
    }
};

相關文章