Java 在不改变程序逻辑的情况下优化给定的解决方案。同时计算时间复杂度

Java 在不改变程序逻辑的情况下优化给定的解决方案。同时计算时间复杂度,java,arrays,Java,Arrays,这是一个GFG实践问题,因此无法配置编译器 问题 给定一个正整数数组。您的任务是找到阵列中的领导者。 注意:如果数组的元素大于或等于其右侧的所有元素,则该元素为前导。此外,最右边的元素始终是指引线 输入: 输入的第一行包含一个整数T,表示测试用例的数量。T测试用例的描述如下。 每个测试用例的第一行包含一个表示数组大小的整数N。 第二行包含N个空间分隔的整数A1、A2、…,表示数组的元素 输出: 打印所有的领导者 约束条件: 1一个问题(可能是花费了很长时间的原因)是compare()方法在遇到较

这是一个GFG实践问题,因此无法配置编译器

问题
给定一个正整数数组。您的任务是找到阵列中的领导者。 注意:如果数组的元素大于或等于其右侧的所有元素,则该元素为前导。此外,最右边的元素始终是指引线

输入: 输入的第一行包含一个整数T,表示测试用例的数量。T测试用例的描述如下。 每个测试用例的第一行包含一个表示数组大小的整数N。 第二行包含N个空间分隔的整数A1、A2、…,表示数组的元素

输出: 打印所有的领导者

约束条件:
1一个问题(可能是花费了很长时间的原因)是
compare()
方法在遇到较大的值时不会停止,因此很明显当前元素不是前导。相反,它将始终比较所有值。
这使得大小为N的数组的代码运行时为O(N^2)

这个问题可以用O(N)来解决。
从数组的右端开始,打印最后一个元素作为引线,并将其设置为当前最大值。然后向左走,检查当前元素是否大于或等于最大值。如果是,则将其打印为引线,并设置为最大值。继续,直到到达阵列的左端

您还可以通过使用简单的for循环来转换字符串来替换recursive toInts()方法来节省一些时间。

一个问题(以及花费很长时间的可能原因)是您的
compare()
方法遇到较大的值时不会停止,因此很明显,当前元素不是指引线。相反,它将始终比较所有值。
这使得大小为N的数组的代码运行时为O(N^2)

这个问题可以用O(N)来解决。
从数组的右端开始,打印最后一个元素作为引线,并将其设置为当前最大值。然后向左走,检查当前元素是否大于或等于最大值。如果是,则将其打印为引线,并设置为最大值。继续,直到到达阵列的左端


您还可以通过使用简单的for循环来转换字符串来替换递归toInts()方法来节省一些时间。

是否有其他方法可以在不更改算法的情况下解决此问题?@T3chn0如果您不更改任何内容,则不会有什么不同。如果在
compare()
中a[x]>=a[y]为false,则可以进行的最小更改是直接返回-1。感谢您的解决方案。TLE的问题在返回-1后得到了解决,但它在递归调用时给了我堆栈溢出错误。你能解决这个问题吗?@T3chn0如果不知道导致错误的确切输入,我真的帮不了你。我根据需求在最长的输入序列上测试了您的代码,它运行起来没有问题。因此,我只能建议将您的算法更改为我描述的迭代版本。是否有其他方法可以在不更改算法的情况下解决此问题?@T3chn0如果您不更改任何内容,将不会有任何不同。如果在
compare()
中a[x]>=a[y]为false,则可以进行的最小更改是直接返回-1。感谢您的解决方案。TLE的问题在返回-1后得到了解决,但它在递归调用时给了我堆栈溢出错误。你能解决这个问题吗?@T3chn0如果不知道导致错误的确切输入,我真的帮不了你。我根据需求在最长的输入序列上测试了您的代码,它运行起来没有问题。因此,我只能建议将您的算法更改为我描述的迭代版本。
import java.util.*;
import java.io.*;
import java.lang.*;
public class Main
{  
    static BufferedReader z1 = new BufferedReader(new InputStreamReader(System.in));
      public static void main (String[] args)throws Exception
    {    
        int T=Integer.parseInt(z1.readLine());
         while(T-- > 0)
        {      
              int N=Integer.parseInt(z1.readLine());
           solution ob = new solution();
              int []a=new int[N];
              a=ob.input(N,z1);
              int x=0;
              ob.leader(a,N,x);
        }
    }
}
class solution
{  
    static int[] input(int N, BufferedReader z1)throws Exception
   {    
         int a[]=new int[N];
          String s=z1.readLine();
          String []str=s.split(" ");
          /* for(int y=0;y<N;y++)
             a[y]=Integer.parseInt(str[y]); */
          toInts(str,a,0);
            return a;
   } 
    
    static void toInts(String[] strings, int[] ints, int start) {
    if (start > strings.length - 1) {
        return;
    }
    ints[start] = Integer.parseInt(strings[start]);
    toInts(strings, ints, start+1);
}
   
    static void leader(int []a,int N,int x)
   {    
           int count = 0;
           if(x==N-1)
            System.out.println(a[x]);
            else
            { 
               count = compare(a,x,x+1,count,N);
             /* for(int y=x+1;y<N;y++)
               if(a[x]>=a[y])
                 count++; */
               if(count==(N-x-1))
                 System.out.print(a[x]);
               leader(a,N,x+1);
            }
    }
    static int compare(int []a,int x,int y,int count,int N)
    {
        if(y==N)
         return count;
        else
        {
            if(a[x]>=a[y])
             count ++;
            return compare(a,x,y+1,count,N);
        }
    }
}
Runtime Error:
Runtime ErrorTime Limit Exceeded

Your program took more time than expected.Time Limit Exceeded
Expected Time Limit 3.00sec