我寫了一個代碼,它可以找出數組中最長的連續區,即連續區中的值之和等於零的模3 ,例如用於陣列a[]={2,-3,5,7,-20,7}
找到陣列中最長的連續區,連續區的值之和等於零模3
我們有2-3 + 5 + 7-20 = -9所以輸出5,我的問題是的複雜性,現在是O(n^3)
鳥低聲說我,這是可以做到在O(n)
public class mmn {
public static void main(String[] args)
{
int a[]={2,-3,5,7,-20,7};
int r=what(a);
System.out.println(r);
}
private static int f(int[]a,int low, int high)
{
int res=0;
for (int i=low;i<=high;i++)
res+=a[i];
return res;
}
public static int what(int[]a)
{
int temp=0;
for(int i=0;i<a.length;i++)
{
for (int j=i;j<a.length;j++)
{
int c=f(a,i,j);
if (c%3==0)
{
if(j-i+1>temp)
temp=j-i+1;
}
}
}
return temp;
}
}
試圖重寫爲O(n):
import java.util.*;
class Main {
public static void main (String[] args) throws Exception {
// you should use only one Scanner object
Scanner scanner = new Scanner(System.in);
int a[]={3,1,3,1,3,1};
int n=a.length;
int S[]=new int[n];
int i[]=new int[n];
int best;
int sum;
for (int j=0; j<n; j++) {
S[j]=a[j]%3;
i[j]=j;// initialize
//System.out.println(S[j]);
//System.out.println(i[j]);
}
best=1;
for (int k=1; k<n; k++) {
if((S[k-1]+S[k])%3==0) {//checking if we want a longer continuum
S[k]=S[k-1]+a[k];
i[k]=i[k-1];
}
if(S[k]<S[best])//check if i should update the better
best=k-1;
}
System.out.println(best);
}
}
獲取鳥告訴你它的方法。 –
'-3 + 5 + 7-20 + 7'是'-4',而不是'-3' – Guy
鳥不可信。尤其是海鷗 –