首页 > 其他分享 >[LeetCode] 1362. Closest Divisors 最接近的因数

[LeetCode] 1362. Closest Divisors 最接近的因数

时间:2023-12-21 09:56:01浏览次数:31  
标签:vector 遍历 Closest int 因子 num 1362 绝对值 Divisors


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.

Example 1:

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.

Example 2:

Input: num = 123
Output: [5,25]

Example 3:

Input: num = 999
Output: [40,25]

Constraints:

  • 1 <= num <= 10^9

这道题说是给了一个数字 num,让找 num+1 或者 num+2 数字的两个因子使得其差的绝对值最小。题意并不难理解,主要就是找给定数字的因子,然后比较其差的绝对值就行了。由于对 num+1 和 num+2 的操作是相同的,所以用一个子函数来实现比较好,找因子并不需要从1遍历到其本身,因为每对儿因子只要处理一次就行了,可以从其平方根遍历到1,对于遍历到的数字i,若其能被 num 整除,则计算两个因子i和 num/i 的差的绝对值,若其小于 diff,则用其来更新 diff,并且将这两个数字记录到 res 中,这样最终结果 res 中保存的就是差的绝对值最小的两个因子了。在主函数中,分别对 num+1 和 num+2 调用这个子函数,然后将得到的两组结果再次分别计算差的绝对值,返回较小的那组即可,参见代码如下:


解法一:

class Solution {
public:
    vector<int> closestDivisors(int num) {
        vector<int> res1 = find(num + 1), res2 = find(num + 2);
        return abs(res1[0] - res1[1]) < abs(res2[0] - res2[1]) ? res1 : res2;
    }
    vector<int> find(int num) {
        vector<int> res;
        int diff = INT_MAX;
        for (int i = sqrt(num); i > 0; --i) {
            if (num % i != 0) continue;
            if (abs(num / i - i) < diff) {
                diff = abs(num / i - i);
                res = {num / i, i};
            }
        }
        return res;
    }
};

其实这道题并不用遍历所有的因子组合,而是从平方根开始往1遍历,第一个找到的因子对儿就一定是差值最小的,为什么呢?因为若一个平方数,其两个平方根作为因子,差的绝对值为0,已经是最小的了,所以偏离平方根的因子的差的绝对值一定是越来越大的,所以找到的第一对儿因子就一定是满足题意的。这里我们从 num+2 的平方根开始往1遍历,对于每个遍历到的数字i,若其是 num+1 的因子,直接返回因子对儿,否则看下若其是 num+2 的因子,直接返回因子对儿即可,参见代码如下:


解法二:

class Solution {
public:
    vector<int> closestDivisors(int num) {
        for (int i = sqrt(num + 2); i > 0; --i) {
            if ((num + 1) % i == 0) {
                return {i, (num + 1) / i};
            }
            if ((num + 2) % i == 0) {
                return {i, (num + 2) / i};
            }
        }
        return {};
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1362


类似题目:

Distinct Prime Factors of Product of Array


参考资料:

https://leetcode.com/problems/closest-divisors

https://leetcode.com/problems/closest-divisors/solutions/517595/java-c-python-easy-and-concise/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:vector,遍历,Closest,int,因子,num,1362,绝对值,Divisors
From: https://www.cnblogs.com/grandyang/p/17918338.html

相关文章

  • CF301D Yaroslav and Divisors
    因为是排列,所以数对总数是调和级数的\(O(n\logn)\),可以暴力枚举。容斥,区间左右端点均在\([l,r]\)中的数对数量等于左右端点均在\([1,r]\)中的数对数量减去左右端点均在\([1,l-1]\)中的数对数量,再减去左端点在\([1,l-1]\)中且右端点在\([l,r]\)中的数对数量。发现前......
  • SP3889 Closest Number题解
    题意简述有两个\(n\)位十进制数\(a\),\(b\)。要将数字\(b\)的每一位重新排列后,使得得到的数字一个在大于等于\(a\)的情况下更接近\(a\),另一个在小于\(a\)的情况下更接近\(a\)。求这两个数,如果找不到就输出0。思路以大于等于\(a\)的为例。我们可以将\(b\)从小......
  • AtCoder Regular Contest 167——B - Product of Divisors
    题目很明显,给定 所有因数的积不断除以最多能除几次。首先,很容易发现,对于每一对因子,都可以对答案得出B的贡献,设A的因子数目为n。将A进行质因数分解,PBa1,PBa2,PBa3……PBam,那么因数个数就是质因子加一的乘积。那么因子对数也就是前者一半。答案就是B乘因子对数除以二注意此处......
  • 题解 - CF1972E - Divisors and Table
    这题正解是虚树,本解法卡常,仅适合不会虚树的。(例如本人)注意:下文中根节点深度定义为1.第一步:转化问题我们把$g(x,y,z)$拆开,考虑每个质数是哪些点的因子。包含这个质数的点构成一个点集,我们只需求这个点集S的$\sum\limits_{x,y,z\inS}f(x,y,z)$。第二步:对......
  • Element.closest()方法
    在上图中我们想在点击bi-pen的时候获取到td绑定的id,常用这是一种常见的方式来访问一个元素的祖父节点。这种写法在简单的情况下是有效的,但在某些情况下可能不够灵活或可维护。所以我们考虑使用closest方法:Element.closest()方法允许你查找最接近当前元素的祖先元素,满足指......
  • B. Longest Divisors Interval
    link需要思考一下如果这个题能做,那么肯定有一种比较可行的做法。如果\([l,r]\)是可行的,那么就意味着\([1,r-l+1]\)是可行的这是显然的,显然后者的每一个数在前者中必然有对应的倍数,所以等效。这样从1开始找就行了。#include<cstdio>#include<iostream>#include<cstring>#i......
  • LeetCode 16. 3Sum Closest 双指针+排序
    Givenanintegerarraynumsoflengthnandanintegertarget,findthreeintegersinnumssuchthatthesumisclosesttotarget.Returnthesumofthethreeintegers.Youmayassumethateachinputwouldhaveexactlyonesolution.Solution先将原数组排序,然......
  • Codeforces 1855B:Longest Divisors Interval 最长的连续约数区间
    1855B.LongestDivisorsIntervalDescription:对于一个整数\(n\)\((1\leqn\leq10^{18})\),找到一段最长的区间\([l,r]\),使得区间内所有数均为\(n\)的约数。Analysis:如果\(n\)是一个奇数(非\(2\)的倍数),由于\(odd=odd\timesodd\),则不可能有连续的两个整数均为......
  • Longest Divisors Interval
    Smiling&Weeping----总有一个人,一直住在心底,却消失在生活里。Givenapositiveintegern,findthemaximumsizeofaninterval[l,......
  • CF1855B Longest Divisors Interval 题解
    原题链接:https://codeforces.com/contest/1855/problem/B题意:给定一个正整数n,找到满足该条件的区间[l,r]的长度的最大值:对于任意l<=i<=r,n均为i的倍数(多组数据)。思路:如果n是奇数,答案显然是1,因为任意两个连续的正整数一定会有一个2的倍数。将这一结论进行推广:......