【數學】B084_LC_可被 K 整除的最小全 1 整數(set 判重 / 數學推導)

一、Problem

給定正整數 K,你需要找出可以被 K 整除的、僅包含數字 1 的最小正整數 N。

返回 N 的長度。如果不存在這樣的 N,就返回 -1。

示例 1:
輸入:1
輸出:1
解釋:最小的答案是 N = 1,其長度爲 1。

輸入:2
輸出:-1
解釋:不存在可被 2 整除的正整數 N 。

提示:

1 <= K <= 10^5

二、Solution

方法一:set 判重

思路

只包含 1 的數字的推導方法是:N = N × 10 + 1(N 初值爲 1),但爲防止溢出,我們在外面增加了一層取模:N = (N × 10 + 1) % K)

如果求解 N的過程中,遇到了重複數字,那麼證明該數字永遠不能被 K 整除了,返回 -1 即可

特判:當 N 爲 1 且 K 爲 1 時,N 可被 K 整除,應立即返回 1

class Solution {
    public int smallestRepunitDivByK(int K) {
        int N = 1 % K, len = 1;
        Set<Integer> seen = new HashSet<>();
        while (N != 0) {
            if (seen.contains(N))
                return -1;
            seen.add(N);
            N = (N * 10 + 1) % K;
            len++;
        }
        return len;
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)

方法二:數學推導 = 空間壓縮

別人的給出的證明說 K = 2 或 5 的倍數時,全 1 數字不可能被此時的 K 除盡,其它一樣…

class Solution {
    public int smallestRepunitDivByK(int K) {
        if (K % 2 == 0 || K % 5 == 0)
            return -1;
        int N = 1, len = 1;
        while (N % K != 0) {
            N = (N * 10 + 1) % K;
            len++;
        }
        return len;
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章