在乙個有n個元素的陣列中,其中每個元素的值可正可負,在該陣列中求乙個連續子陣列,使得該陣列的和最大
拿到這個題首先想到的是暴力法,即暴力迴圈求所有陣列的和,因此可以求的該陣列的最大值,其時間複雜度為o(n^3)
時間複雜度較高,我們可以用分治法和動態規劃來做這道題。其中分治法時間複雜度為o(n*logn),而動態規劃為o(n)。
暴力法:
private
static
void f1(int array)
if (array.length == 1)
int max = array[0];//最大值
int start = 0; //陣列的起始下標
int end = 0; //陣列的終止下標
for (int i = 0; i < array.length; i++)
if (sum > max) }}
for (int i = start; i <= end; i++)
system.out.println("\n" + max);
}
分治法
private
static
int f2(int array, int start, int end)
int mid = (start + end) / 2;
int m1 = f2(array, start, mid); // 最大值在前一半
int m2 = f2(array, mid + 1, end); // 最大值在後一半
int mf = array[mid];
intsum = 0;
for (int i = mid; i >= start; i--)
}int mb = array[mid + 1];
sum = 0;
for (int i = mid + 1; i <= end; i++)
}int m3 = mf + mb;
int res = 0;
if (m1 > m2) else
if (res < m3)
return res;
}
動態規劃:
// s[k+1] = max ( s[k]+a[k+1], a[k+1] ) 要麼繼續連續,要麼斷開
private
static
int f3(int array, int start, int end) else
if (sum > max)
}return max;
}
如何求最大子陣列之和
問題概述 有乙個長度為n的陣列,這n個元素可以使正數也可以是負數,陣列中連續的乙個或多個元素可以組成乙個連續的子陣列,乙個陣列可以有多個這樣連續的子陣列,求子陣列各個元素和的最大值。找出所有子陣列元素,進行求和,然後找到和的最大值 public static int findsecond int a...
求最大子串行之和
摘要 給出乙個序列,求出其中連續的子串行中和最大的乙個。如 1 3 5 2 1 4 5 最大子串行之和是2 1 4 5 基本思路 最簡單的辦法就是遍歷一邊序列,用變數thissum記錄遍歷過的元素之和,當thisum 0時,繼續相加.若thisum 0,令thisum 0,吧下乙個元素作為新的子串行...
求最大子串行之和
今天一下午在看sharepoint了,又有活幹,所以時間比較緊湊,於是想起了前些日子寫的求最大子串行之和,作為每日一小題吧,暫做自我安慰吧。求最大子串行之和,主要要注意他的效率,1,演算法複雜度是o pow n,2 int max sub int a,int size return max 2,演算...