最大子串問題

2021-08-21 08:28:34 字數 1791 閱讀 3732

例如:-2,-4,-7,-20,1,1,1,1,-10,1,1,1,-10,10,10,10,-25,10,10,10,10,10,10,-300

首先,看到這個問題我們最先想到的一種方法就是:找到所有的子串,然後通過依次比較,找到最大的。

接下來我們演示一下這種方法的**。

public int getmaxvalue_strings_num(int strings ) 

for( int k = i+1 ; k < strings.length ; k++ ) }}

return maxvalue;

}

這種方法的過程就是,長度為n的數字串

第一層找到的子串:strings[0]、strings[0]

strings[1]、strings[0]

strings[1]

strings[2]、strings[0]

……strings[n-1]

第二層找到的子串:strings[1]、strings[1]strings[2]、strings[2]

strings[3]

strings[4]、strings[1]……strings[n-1]

最後一層找到的子串

:strings[n-1]。

這樣就找到了全部的數字子串。

當然了這種演算法並不是我們想要的最理想的演算法。我們希望找到一種時間複雜度為o(n)的演算法。接下來演示這種演算法。

首先我們需要分情況考慮。

第一種情況:這組數字串都是正數,那麼很好考慮,最大的子串就是它本身嘛。

第二種情況:這組數字串都是負數,相對也好考慮,因為 

負數a+負數b   肯定小於負數a,也小於負數b,

最大的數字子串肯                              定就是最大的某乙個負數。

所以遍歷一遍就可以了,這裡就不演示了。

第三種情況:這組數字串有正有負怎麼辦,廢話不說,直接上演算法。

public int getmaxnum_n_1(int a) 

if(positivenum > maxnum)

} return maxnum;

}

這個演算法的核心思想就是:

有乙個maxnum儲存最大的子串之和。

有乙個positivenum儲存當前為正的子串。

迴圈一遍,一旦positivenum

< 0,直接捨棄,把它 = 0,因為它一旦 < 0,對於後邊的子串來說是沒有意義的,

因為負數 + 正數 < 正數

一旦,positivenum > maxnum,就讓 maxnum = positivenum 。最終的maxnum 就是我們想要的最大子串的和。

那麼問題來了,有沒有一種演算法可以同時適用於上邊三種情況呢,哎,因為俺智力受限,我就不解釋這種演算法了,直接上演算法!

public int getmaxnum_n(int a) 

if( positivenum < 0 )

} return maxnum;

}

這個問題就更難了,俺更不解釋了。。。。。。哎。。。。。。。直接上演算法。。。。。。。。。。。

static string max(int num) 

if( positivenum < 0 )

}return maxstring.replace(",", " ");

}

最大子串和問題

問題 給定一組數字,求連續的字串的最大的和。這裡要注意題目中是子串和而不是子串行和。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的要求。如果求子序列,可直接把這組數字中的正數相加即可。最開始想著只要把這組數字中各個正數子串行分別求和,比較哪個大就行了,後來發現不對。比如 正數子串行分別為,其...

最大子串和問題(Maximum Subarray)

又乙個經典問題,對於乙個包含負值的數字串array 1.n 要找到他的乙個子串array i.j 0 i j n 使得在array的所有子串中,array i.j 的和最大。這裡我們需要注意子串和子串行之間的區別。子串是指數組中連續的若干個元素。子串行只要求各元素的順序與其在陣列中一致,而沒有連續的...

平方串 最大子串行問題

題目描述 如果乙個字串s是由兩個字串t連線而成,即s t t,我們就稱s叫做平方串,例如 aabaab x 都是平方串.牛牛現在有乙個字串s,請你幫助牛牛從s中移除盡量少的字元,讓剩下的字串是乙個平方串。換句話說,就是找出s的最長子序列並且這個子串行構成乙個平方串。輸入描述 輸入乙個字串s,字串長度...