5171-最接近的因数

5171-最接近的因数

给你一个整数 num,请你找出同时满足下面全部要求的两个整数:

两数乘积等于 num + 1 或 num + 2
以绝对差进行度量,两数大小最接近
你可以按任意顺序返回这两个整数。

示例 1:

输入:num = 8
输出:[3,3]
解释:对于 num + 1 = 9,最接近的两个因数是 3 & 3;对于 num + 2 = 10, 最接近的两个因数是 2 & 5,因此返回 3 & 3 。

示例 2:

输入:num = 123
输出:[5,25]

示例 3:

输入:num = 999
输出:[40,25]

提示:

1 <= num <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-divisors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

O(n2)超时

class Solution {
    public int[] closestDivisors(int num) {
        int[] res = new int[2];
        int diff = Integer.MAX_VALUE;
        int sqrt = (int) Math.sqrt(num);
        for(int i = sqrt; i <= num; i++) {
            for(int j = sqrt + 1; j > 0; j--) {
                int mul = i * j;
                if((mul == num + 1 || mul == num + 2)) {
                    int abs = Math.abs(i - j);
                    if(abs < diff) {
                        res[0] = j;
                        res[1] = i;
                        diff = abs;
                        if(diff == 0) {
                            return res;
                        }
                    }
                }
            }
        }

        return res;
    }

改进

    public int[] closestDivisors(int num) {
        int[] res = new int[2];

        int num1 = num + 1;
        int num2 = num + 2;
        int sqrt1 = (int) Math.sqrt(num1);

        if(Math.pow(sqrt1 + 1, 2) == num2) {
            return new int[]{sqrt1 + 1, sqrt1 + 1};
        }
        
        for(int i = sqrt1; i <= num2; i++) {
            int j = num2 % i;
            int k = num1 % i;
            if(j == 0 || k == 0) {
                if(k == 0) {
                    j = num1 / i;
                } else {
                    j = num2 / i;
                }
                res[0] = Math.min(i, j);
                res[1] = Math.max(i, j);
                return res;
            }
        }

        return res;
    }

继续改进:从1~sqrt显然比sqrt~num+2数更少

    public int[] closestDivisors(int num) {
        int[] r = new int[2];

        int sqrt = (int) Math.sqrt(num + 2);
        for (int i = sqrt; i >= 1; i--) {
            if ((num + 1) % i == 0) {
                r[0] = i;
                r[1] = (num + 1) / i;
                return r;
            }

            if ((num + 2) % i == 0) {
                r[0] = i;
                r[1] = (num + 2) / i;
                return r;
            }
        }
        return r;
    }

猜你喜欢

转载自www.cnblogs.com/angelica-duhurica/p/12350503.html