找到数组中最长的连续体,连续体中的值之和等于零模3

编程入门 行业动态 更新时间:2024-10-15 16:18:28
本文介绍了找到数组中最长的连续体,连续体中的值之和等于零模3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我写了一个代码,找到数组中最长的连续体,连续体中的值之和等于零模3,例如对于数组 a [] = {2,-3, 5,7,-20,7}

我们有2-3 + 5 + 7-20 = -9,所以输出为5 ,我的问题是的复杂性,现在是 O(n ^ 3)一只鸟低声说,可以在 O(n)

public class mmn { public static void main [] 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; (int i = low; i< = high; i ++) res + = a [i]; return res; } public static int what(int [] a) { int temp = 0; (int i = 0; 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 { //应该只使用一个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最好; int sum; (int j = 0; j< n; j ++) { S [j] = a [j]%3; i [j] = j; //初始化 //System.out.println(S[j]); //System.out.println(i[j]); } best = 1; (int k = 1; k

解决方案

在Python中的一个 O(n)算法的例证,使一个遍历数组。这个想法是 dp [i] [r] 表示最长的序列, s ,以索引 i 其中(sum s)%3 = r 。 Cleary我们寻找最高的 dp [i] [0] 。如果前面的步骤根据适当的模结果记录任何长度,我们只能增加特定单元的序列。由于我们每次通过数组迭代访问三个单元格(一个常量),所以该算法具有时间和空间复杂度。 (空格可以很容易地适应 O(1),因为我们只需要在每次迭代时使用前三个单元格。)

a = [2,-3,5,7,-20,7] best = 0 对于我在范围(1(1)+ 1)中的i,bestIndex = -1 dp = [[0,0,0]]] len(a)+ 1):r = a [i-1]%3 为范围(3)中的j: canSumToJ = dp [i-1] [ (3 + j-r)%3]> 0 dp [i] [j] = max(1如果r == j else 0 ,1 + dp [i-1] [(3 + j - r)%3 ]如果canSumToJ else 0) bestIndex = i - 1如果dp [i] [0]>最佳其他bestIndex best = max(best,dp [i] [0]) print(best,(bestIndex - best + 1,bestIndex))#(5,(0, 4)) #dp #=> [[0,0,0] #,[0,0,1] #,[1,0,2] #,[0,3,2] #,[3,1,4] #,[5,4,2] #,[3,6,5]] pre>

I wrote a code that finds the longest continuum in the array that the sum of the values in the continuum equal to zero modulo 3, e.g for the array a[]={2,-3,5,7,-20,7}

We have 2-3+5+7-20=-9 so the output is 5, My problem is the complexity, now it's O(n^3) a bird whispered me that it can be done in 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; } }

Attempt to rewrite in 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); } }

解决方案

Here's an illustration of an O(n) algorithm in Python, making one pass over the array. The idea is that dp[i][r] represents the longest sequence, s, ending at index i where (sum s) % 3 = r. Cleary we look for the highest dp[i][0]. We can only augment the sequence for a particular cell if the previous step recorded any length at all for the appropriate modulo result. Since we access only three cells (a constant) on each iteration through the array, the algorithm has O(n) time and space complexity. (Space can be easily adapted to O(1) since we only need the previous three cells at each iteration.)

a = [2,-3,5,7,-20,7] best = 0 bestIndex = -1 dp = [[0,0,0] for i in range(len(a) + 1)] for i in range(1,len(a) + 1): r = a[i-1] % 3 for j in range(3): canSumToJ = dp[i-1][(3 + j - r) % 3] > 0 dp[i][j] = max(1 if r == j else 0 ,1 + dp[i-1][(3 + j - r) % 3] if canSumToJ else 0) bestIndex = i - 1 if dp[i][0] > best else bestIndex best = max(best,dp[i][0]) print(best,(bestIndex - best + 1, bestIndex)) # (5, (0, 4)) # dp # => [[0, 0, 0] # ,[0, 0, 1] # ,[1, 0, 2] # ,[0, 3, 2] # ,[3, 1, 4] # ,[5, 4, 2] # ,[3, 6, 5]]

更多推荐

找到数组中最长的连续体,连续体中的值之和等于零模3

本文发布于:2023-11-29 19:57:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1647473.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:之和   组中   最长   等于零

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!