这是一个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
一个问题(也可能是长时间的原因)是,compare()
方法一旦遇到较大的值就不会停止,因此很明显当前元素不是leader。相反,它将始终比较所有值。
对于大小为N的数组,这使得代码的运行时为O(n^2)。
这个问题可以在O(N)中解决。
从数组的右端开始,打印最后一个元素作为leader,并将其设置为当前最大值。然后左转,检查当前元素是否大于或等于最大值。如果是,则将其打印为前导,并将其设置为最大值。继续,直到到达数组的左端。
您还可以通过使用简单的for-loop替换递归的toInts()方法来转换字符串来节省一些时间。
如何计算以下函数的时间复杂度? 现在,我知道循环具有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)。为什么?
我在这里编写了一个Python解决方案,它解决了以下问题:如何用最少数量的给定面额的硬币来制造给定数量的货币? 虽然我的解决方案有效,但当大于50或的长度大于5时,需要很长时间。我怎样才能加快代码的速度,使其能够在相当大的输入下工作?我是否错过了一个技巧或其他可以大大加快代码速度的东西?
我想澄清一下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