例如:-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,字串長度...