这段代码的逻辑是如何工作的?无法理解

问题描述 投票:0回答:1

我试图解决编码问题。这是问题陈述。 问题陈述:给定一个包含 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 logic dsa
1个回答
0
投票
  1. Arrays.sort(arr);
    因为您正在寻找
    n
    整数除以
    n!
    的最大可能乘积,所以您需要数组中最大的
    n
    整数。
  2. 这个 while 循环只是向后迭代数组,因为 Arrays.sort 提供了一个按升序排列的数组
  3. arr[i]>=l
    正在检查数组中下一个最大的元素是否大于数组的新长度。由于
    n!
    等于
    n*(n-1)!
    ,而
    n
    大于
    0
    ,因此检查新项是否大于
    n
    会告诉您分子的增加是否会超过增加的长度,从而导致分母的增加。只要这种情况持续存在,循环就会继续,一旦分母增长超过分子,循环就会退出。
© www.soinside.com 2019 - 2024. All rights reserved.