題目描述:
給定乙個整數陣列nums
,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
這道題剛開始沒有思路,也沒讀懂題目的意思,最後,明白,就是這個陣列中的元素組成的子串行的和最大就行,子串行至少包含乙個元素。例如例子中,子串行可以為很多,但最大的是4,-1,2,1,和為6.
明白了題目什麼意思,那麼這道題就很明確了,自己的想法結合其他網友的解答,我總共總結除了三種思路。
先來看**:
第一種方法:
int a = ;
int sum = 0;
int num = a[0];
// 第一種方法,sum儲存每一位相加時的和,num儲存最終結果,與sum比較大的儲存給num,小的,捨去.
for (int i=0;i0)else
num = num>sum?num:sum;
}system.out.println(num);
這種方法,就是遍歷陣列,然後當和大於0時就將元素相加,小於0時就將對應的i的值賦值給sum.這是什麼意思呢?也就是說,在題目要求下,陣列**現負數對這個和是有影響的,當和為負數時,證明前面的元素都白相加了,那麼就將此時對應的i賦值給sum,然後用另外乙個變數儲存最大的sum。最後輸出。(用到三元運算子,當num大於sum時賦值num,否則賦值sum)
執行結果:
第二種方法:
/ 第二種方法
// 用來求和,當i所指的前乙個元素大於0時,相鄰兩位相加,不相等是,保持不懂
for (int i = 1;i0)
}int max = a[0];
// 比較陣列中的最大值,最大值即為所要求的和
for (int i=1;ia[i]?max:a[i];
}system.out.println(max);
這種方法沒有另外宣告變數,只是用乙個max變數儲存最大的和。這個方法能比第乙個好理解一點,就是,遍歷陣列,從第二個元素開始,當他的前乙個元素大於0時,將這兩個元素相加,賦值給i對應的元素,(因為負數對結果造成影響,所以當前乙個元素為負數時,捨去。這個地方為什麼要前乙個元素不為負數時相加呢?這是因為陣列從1開始遍歷,第乙個元素為i-1,遍歷時會每個元素都會判斷是否為負數。)然後得到的『新的陣列』,就是每一次比較相加的和,然後只需要遍歷陣列,判斷新陣列中的最大值,即為所要求的最大子串行的和。
第三種方法:
// 第三種方法,這個最好理解,就是乙個用來儲存結果,乙個用來移動求和.
//先將sum定義為陣列的第0個元素,如果sum加上第i(從1開始)個元素,
比第i個元素大,則將sum和第i個元素加起來,否則,將第i個元素賦值給sum(因為第i個元素都比元素和要大了,
則這個和就沒用了,然後將新的大於這個和的值,賦值給sum.例如[-1,-2,4],計算到最後-2+4的和小於4了,
那麼將4賦值給sum就是最大的子串行和.)
// 然後一邊移動相加得到sum,一邊與(最終答案)num(也就是儲存最大的那個sum值)比較,
小的捨棄,大的付給num.最後輸出.
int num = a[0];
int sum = a[0];
for (int i = 1;ia[i])else
// 儲存最大sum值
if (num這個方法和第一種很相似但又有點不相同,總結來說就是,定義兩個變數都指向陣列的第乙個元素,然後判斷sum和陣列i對應元素相加是否大於i對應元素,不大於就將a[i]賦值給sum,大於就sum與a[i]相加。最後與num比較,儲存最大的sum.輸出即可。例如:【1,-2,-3,4】,sum=1.然後判斷1-2>-2,則sum=-1,然後判斷,num與sum誰大,num=1,以此類推,最後輸出1.
也就是,判斷和是否小於其中的元素,小於令sum=這個元素,大於時,就相加。
總結:這道題看似不太難,但其中的內涵還是很豐富的,有些地方,自己也沒有想到。還是差很多,慢慢來繼續行走
2019-1-31記錄
leetcode最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。在本題中,我想到的兩...
Leetcode 最大子序和
題目描述 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。解題思路 ...
LeetCode 最大子序和
給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。input 2,1 3,4,1 2,1 5,4 output 6動態規劃 python class solution def maxsubarray self,nums int tmp nums 0 ma...