(7)連續子陣列問題

2021-06-14 11:35:35 字數 3083 閱讀 3884

#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的最長連續子陣列。思路來自 連續陣列的解...