我试图解决编码问题。这是问题陈述。 问题陈述:给定一个包含 N 个元素的数组,找到最长子序列的长度,使得子序列中的元素除以其长度的阶乘的乘积最大化。
我编写了一个计算阶乘的代码,并执行问题中要求的任何操作并获得输出。然而,我找到了一个解决方案,这让我质疑我付出的所有努力。我仍然无法理解该解决方案。谁能解释一下其背后的逻辑:
class Solution{
public int longestSubsequenceLength(int n,int[] arr)
{
Arrays.sort(arr);
int l=1;;
int i=n-1;
while(i>=0){
if(arr[i]>=l){
l++;
}
else{
break;
}
i--;;
}
l--;
// System.out.println(Arrays.toString(arr));
return l;
}
}
Arrays.sort(arr);
因为您正在寻找 n
整数除以 n!
的最大可能乘积,所以您需要数组中最大的 n
整数。arr[i]>=l
正在检查数组中下一个最大的元素是否大于数组的新长度。由于 n!
等于 n*(n-1)!
,而 n
大于 0
,因此检查新项是否大于 n
会告诉您分子的增加是否会超过增加的长度,从而导致分母的增加。只要这种情况持续存在,循环就会继续,一旦分母增长超过分子,循环就会退出。