給定乙個整數陣列,找到乙個連續子陣列其元素之和最大並返回三種解法,分別是動態規劃、貪心法、分治法,其中分治演算法不是最優的。input:nums
output:最大連續子陣列之和
定義d p[
i]
dp[i]
dp[i
]:以位置i
ii為結尾的子陣列最大和
d p[
i+1]
=dp[i] + nums[i], dp[i]>0 \\ nums[i], 其他 \end
dp[i+1
]=int maxsum = nums[0]
;for
(int i =
1;i)return maxsum;
}cursum用於記錄當前和(每一步都選擇最優的方案)
僅僅需要遍歷陣列一次,時間複雜度為o(n),空間複雜度為o(1)。
/**
* 貪心
* @param nums
* @return
*/public
intmaxsubarraygreed
(int
nums)
int cursum = nums[0]
, maxsum = cursum;
for(
int i =
1;i)return maxsum;
}
首先將陣列劃分成左和右兩部分,具有最大和的連續子陣列的位置可能有如下三種情況:
位於左邊的陣列部分;
位於右邊的陣列部分;
位於左和右交叉的部分,即最大子陣列有一部分在左邊,一部分在右邊。
其中,第一種情況和第二種情況可以遞迴。第三種情況由函式crosssum暴力計算,需要遍歷陣列一次,使得時間複雜度需要乘o(n)
/**
* 暴力計算包含位置p在內的最大子陣列和
* @param nums
* @param left
* @param right
* @param p
* @return
*/private
intcrosssum
(int
nums,
int left,
int right,
int p)
cursum =0;
for(
int i = p+
1;i<=right;i++
)return leftsubsum + rightsubsum;
}private
inthelper
(int
nums,
int left,
int right)
/** * 分治
* @param nums
* @return
*/public
intmaxsubarraydivide
(int
nums)
return
helper
(nums,
0, nums.length-1)
;}
時間複雜度為o(nlogn),helper函式多次遞迴,造成了空間複雜度為o(logn)。 經典演算法 求最大子串行的和
最大連續子串行的和是一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。例 輸入序列 2,3,1,4 輸出 9 注意 可以假設 輸入的陣列不為空,同時輸入的值都是整數。解法一 暴力破解 可以窮舉出所有的子串行,然後...
和最大子串行
問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...
最大子串行和
最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...