当前位置: 首页 > 知识库问答 >
问题:

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

许鸿志
2023-03-14

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

问题
给定正整数数组。你的任务是找到阵中的首领。注意:数组中的元素如果大于或等于其右侧的所有元素,则为leader。还有,最右边的元素总是一个领导者。

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

输出:打印所有领导人。

约束:
1<=T<=100
1<=N<=107
0<=Ai<=107

我的解决方案:

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

共有1个答案

颜鸿云
2023-03-14

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

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

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

 类似资料:
  • 我在这里编写了一个Python解决方案,它解决了以下问题:如何用最少数量的给定面额的硬币来制造给定数量的货币? 虽然我的解决方案有效,但当大于50或的长度大于5时,需要很长时间。我怎样才能加快代码的速度,使其能够在相当大的输入下工作?我是否错过了一个技巧或其他可以大大加快代码速度的东西?

  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。

  • 每个顶点可以连接到(V-1)个顶点,因此每个顶点的相邻边数是V-1。假设E代表连接到每个顶点的V-1条边。 查找和更新最小堆中每个相邻顶点的权重为O(log(V))+O(1)或 因此,从上面的步骤1和步骤2,更新顶点的所有相邻顶点的时间复杂度是e*(logV)。或. 因此所有V顶点的时间复杂度为V*(E*logv),即。 但Dijkstra算法的时间复杂度为O(ElogV)。为什么?

  • 我想澄清一下O(N)函数。我正在使用SICP。 考虑书中生成伪代码递归过程的阶乘函数: 我不知道如何测量步数。也就是说,我不知道“步骤”是如何定义的,所以我使用书中的语句来定义步骤: 因此,我们可以计算n!通过计算(n-1)!将结果乘以n。 我想这就是他们所说的一步。对于一个具体的例子,如果我们跟踪(阶乘5), 阶乘(1)=1=1步(基本情况-恒定时间) 阶乘(2)=2*阶乘(1)=2步 阶乘(3

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 我正在解决这个问题:回文子串 给定一个字符串,您的任务是计算该字符串中有多少回文子字符串。 具有不同开始索引或结束索引的子字符串被计为不同的子字符串,即使它们包含相同的字符。 我尝试了多种方法,根据我的说法,这两种方法的复杂性都为。但是leetcode接受一种解决方案并返回超过另一种解决方案的时间限制。 可接受的解决方案: 超出时间限制的解决方案 这两种算法中唯一的变化是,第一种算法使用Pytho