#include using namespace std;
/* 輸入乙個整形陣列,陣列裡有正數也有負數。
陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。
求所有子陣列的和的最大值。要求時間複雜度為o(n)。
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,
和最大的子陣列為3, 10, -4, 7, 2, 因此輸出為該子陣列的和18。
1.三重迴圈 n*3
2.兩重迴圈 n*2
3.分治法 nlogn
4.動態規劃 n
*/void testmaxsumofsequence();
// 三重迴圈
void maxsumofsequence(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend);
// 兩重迴圈
void maxsumofsequence_2(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend);
// 分治法
void maxsumofsequence_3(int *arr, unsigned start, unsigned end, int &best, unsigned &beststart, unsigned &bestend);
// 以middle為軸,向左、向右計算,求出最大
void middlesum(int *arr, unsigned start, unsigned end, int middle, int &best, unsigned &beststart, unsigned &bestend);
// 動態規劃
/* sum[i]:前i個且包含i的最大和
sum[i] = max
*/void maxsumofsequence_4(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend);
// 二維陣列
// 乘積列:如果sum>1..,但是正負交替呢?
#include #include "7_maxsumofsequence.h"
void testmaxsumofsequence();
//int best = 0x80000000;
int best = 0x1<<31;
unsigned left, right;
maxsumofsequence_4(arr, 7, best, left, right);
cout << best << endl;
cout << left << " -> " << right << endl;
for (unsigned i = left; i <= right; ++i)
}// 三重迴圈
void maxsumofsequence(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend)
if (sum > best)
} }}
void maxsumofsequence_2(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend)
} }}// 包含左邊、右邊、中間
void maxsumofsequence_3(int *arr, unsigned start, unsigned end, int &best, unsigned &beststart, unsigned &bestend)
else
beststart = bestend = start;
} unsigned middle = (start + end) / 2;
// middle 放入左邊
int bestleft = -int_max;
unsigned bestleftstart = 0;
unsigned bestleftend = 0;
maxsumofsequence_3(arr, start, middle, bestleft, bestleftstart, bestleftend);
int bestright = -int_max;
unsigned bestrightstart = 0;
unsigned bestrightend = 0;
maxsumofsequence_3(arr, middle + 1, end, bestright, bestrightstart, bestrightend);
if (bestright > bestleft)
else
unsigned middlestart;
unsigned middleend;
int middlebest;
middlesum(arr, start, end, middle, middlebest, middlestart, middleend);
if (middlebest > best) }
void middlesum(int *arr, unsigned start, unsigned end, int middle, int &best, unsigned &beststart, unsigned &bestend)
} unsigned toright = middle + 1;
int rightsum = 0;
int rightmaxsum = 0;
while (toright <= end) }
best = leftmaxsum + rightmaxsum;
}void maxsumofsequence_4(int *arr, unsigned n, int &best, unsigned &beststart, unsigned &bestend)
if (sum < 0)
}}
7 連續子陣列的最大和(子陣列 最大和)
題目 給乙個陣列,讓求連續陣列元素的最大和。public int maxsumofsubarray int arr 思路 連續子陣列的最大和動態規劃 dp i dp i 表示以arr i 結尾的連續子陣列的最大和。arr i 必須加上,就不判斷arr i 是正還是負。dp i 等於arr i 加上以...
523 連續的子陣列和
解法一 字首和的暴力搜尋 o n 2 我們遍歷每乙個連續的序列,判斷他是否滿足條件,我們使用字首和 這種解法相信不用多說就會的 public boolean checksubarraysum int nums,int k 迴圈處理每一段連續的序列 for int i 0 i nums.length ...
52 連續陣列
題目描述 給定乙個二進位制陣列,找到含有相同數量的 0 和 1 的最長連續子陣列 的長度 示例 1 輸入 0,1 輸出 2 說明 0,1 是具有相同數量0和1的最長連續子陣列。示例 2 輸入 0,1,0 輸出 2 說明 0,1 或 1,0 是具有相同數量0和1的最長連續子陣列。思路來自 連續陣列的解...