《算法零基础》第10讲:因子分解和枚举(部分)
Posted Sauron7i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法零基础》第10讲:因子分解和枚举(部分)相关的知识,希望对你有一定的参考价值。
前言
原文章出处专栏为: 算法零基础100讲
若你也想学好算法与数据结构,请跟着他的脚步: 英雄哪里出来
LeetCode 1492. n的第k个因子
原题链接: 1492. n的第k个因子
分析
题目中说到,考虑整数n的所有因子,并升序排列,找出第k个,其实不用想的那么麻烦。
直接采用从1开始枚举,如果枚举的数字能整除 n ,则记录一次,这样枚举本来就是升序排列找到第K个。
代码
int kthFactor(int n, int k)
{
int count = 0, ans = -1;
for (int i = 1; i <= n; ++i)
{
if (n % i == 0) //是因子记录一次
count++;
if (count == k) //当记录次数等于k,就找到了
{
ans = i;
break;
}
}
return ans;
}
LeetCode 1362. 最接近的因数
原题链接: 1362. 最接近的因数
分析
根据题意,首先要枚举num+1和num+2;
再从1到sqrt(num + 1),1到sqrt(num+2)枚举,因为如果在1到sqrt(num+1)之间有因子,那么在sqrt(num+1)到(num+1)之间有对应的因子。
如果是因子的话,将两个因子差的绝对值和上一次的因子作比较,如果差值更小,就将两个因子放入该返回的数组中。
代码
int* closestDivisors(int num, int* returnSize)
{
//申请返回数组
*returnSize = 2;
int* ans = (int*)malloc(sizeof(int) * 2);
if (NULL == ans) return NULL;
//先将第一次的差置为最大值,为了下面的比较
ans[0] = 0, ans[1] = INT_MAX;
//枚举 num+1 和 num+2
for (int n = num + 1; n <= num + 2; ++n)
{
for (int i = 1; i * i <= n; ++i)
{
if (n % i == 0) //如果是因子,就进来判断
{
// 每次和上一次的差值作比较,更小的放入数组
if (abs(n / i - i) < abs(ans[0] - ans[1]))
{
ans[0] = n / i;
ans[1] = i;
}
}
}
}
return ans;
}
由于我的理解能力和数学不太好,做到这一步也算可以。
谢谢大家观看~~
以上是关于《算法零基础》第10讲:因子分解和枚举(部分)的主要内容,如果未能解决你的问题,请参考以下文章