【數學】B067_LC_最接近的因數(枚舉 / 優化)

一、Problem

Given an integer num, find the closest two integers in absolute difference whose product equals num + 1 or num + 2.

Return the two integers in any order.

Input: num = 8
Output: [3,3]
Explanation: For num + 1 = 9, the closest divisors are 3 & 3, for num + 2 = 10,
 the closest divisors are 2 & 5, hence 3 & 3 is chosen.

二、Solution

方法一:枚舉

… 話不多說,上來就是枚舉…

class Solution {
    public int[] closestDivisors(int num) {
        int min = 0x3f3f3f3f, res[] = new int[2], num1 = num + 1, num2 = num + 2, sqrt = (int)Math.sqrt(num2); 
        for (int i = 1; i <= sqrt; i++) {
            if (num1 % i == 0) {
                int oth1 = num1 / i;
                int d1 = Math.abs(i - oth1);
                if (d1 < min) {
                    min = d1;
                    res = new int[] {i, oth1};
                }
            }
            if (num2 % i == 0) {
                int oth2 = num2 / i;
                int d2 = Math.abs(i - oth2);
                if (d2 < min) {
                    min = d2;
                    res = new int[] {i, oth2};
                }
            }
        }
        return res;
    }
}

複雜度分析

  • 時間複雜度:O(logn)O(logn)
  • 空間複雜度:O(1)O(1)

方法二:優化

sqrt 是由 num 開方得到的,所以從大往小枚舉得到的兩個因數的差值 d 是逐漸增大的,故第一次遍歷到的因數就是合法因數對。

class Solution {
    public int[] closestDivisors(int num) {
        int num1 = num + 1, num2 = num + 2, s = (int)Math.sqrt(num2); 
        for (int i = s; i >= 1; i--) {
            if (num1 % i == 0)
                return new int[] {i, num1 / i};
            if (num2 % i == 0) 
                return new int[] {i, num2 / i};
        }
        return null;
    }
}

複雜度分析

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