53 最大子序和

2022-09-12 23:09:18 字數 2828 閱讀 4447

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

推薦參考:

1

public

class

maxsubarray

8if(array.length == 1)

11int len =array.length;

12int res = new

int[len];

13 res[0] = array[0];

14int max = res[0];

15for(int i=1; i) else

22 max =math.max(res[i], max);23}

24return

max; 25}

26//

方法二:暴力法,依次計算每個子陣列的和,選擇其中最大的子陣列,時間複雜度為n^3

27public

int maxsubarray2(int

array)

31int len =array.length;

32int sum = 0;

33int max = array[0]; //

只有乙個元素時最大值即為該元素

34for(int i=0; i)

39if(sum >max)

42 sum = 0;43}

44}45return

max;46}

47//

方法二:暴力法改進,在第三層迴圈中,每次都要計算上次已經計算的序列,發生了重複計算,所以可以在前一次的計算的基礎上

48//

相加,減少一層迴圈,時間複雜度為n^2

49public

int maxsubarray22(int

array)

53int len =array.length;

54int sum = 0;

55int max = array[0];

56for(int i=0; i) 62}

63 sum = 0;64}

65return

max;66}

67//

方法三:分治法,將整個陣列一直拆分至單個元素,從下往上得到最大值。

68//

把陣列分成兩個序列,最大連續子串行和要麼在左半部分,要麼在右半部分,要麼是橫跨左右部分

69public

int maxsubarray3(int

array)

73return maxsubarraypart(array, 0, array.length - 1);74}

75private

int maxsubarraypart(int array, int left, int

right)

80int mid = (left + right) / 2;

81//

左半部分最大值

82int maxleft =maxsubarraypart(array, left, mid);

83//

右半部分最大值

84int maxright = maxsubarraypart(array, mid+1, right);

8586

//跨邊界最大值,必定包括左半部分的最後乙個元素,以及右半部分的第乙個元素

87//

邊界以左

88int sum = 0;

89int maxleftborder =array[mid];

90for(int i=mid; i>=left; i--) 95}

96//

邊界以右

97 sum = 0;

98int maxrightborder = array[mid+1];

99for(int i=mid+1; i<=right; i++)

104}

105int maxborder = maxleftborder +maxrightborder;

106//

return math.max(math.max(maxright, maxleft), maxborder);

//兩者皆可

107return (maxright>maxleft) ? (maxright>maxborder ?maxright : maxborder)

108 : (maxleft>maxborder ?maxleft : maxborder);

109}

110111

//方法四:動態規劃(動態規劃三要素:最優子結構(遞迴方程)、邊界條件(終止條件)和狀態轉移方程(前兩者總結))

112//

對於第i個元素,有兩種選擇,要麼加入已存在的連續子陣列,要麼只包括自己開啟新的連續子陣列。判斷條件是前面已經

113//

存在的連續子陣列和是否大於0。

114//

狀態轉移方程:dp = max[arr[i], arr[i] + sum]

115public

int maxsubarray4(int

array) else

126if(sum >result)

129}

130return

result;

131}

132133 }

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。兩個變數,乙個是ans,用來儲存 更新子串行 乙個maxn,始終儲存著當前最大的子串行。子串行...

53 最大子序和

題目 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。思路 因為要考慮連續,所以需注意兩點,與當前比較的必定包含當前節點的上乙個節點,前n個節點...

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。package le...