每日程式設計28之求最大子陣列 o N 複雜度

2021-06-13 14:57:49 字數 1076 閱讀 8722

之前研究演算法,還剩下三大難題——kmp,rb-tree和dp。。

本來是想把dp這一遺留問題解決,就看到了這個問題,後面才發現這個問題其實很簡單,完全用不到動態規劃的思想,或者是最簡單的一維dp。

問題描述,

乙個陣列,n個元素,有正有負

求最大子陣列,要求o(n)複雜度

例如,輸入陣列為 1,-2,3,10,-4,7,2,-5  則和最大的子陣列為3,10,-4,7,2

解決方案

對陣列進行一次遍歷,在遍歷的過程中記錄一些資訊,並不斷的更新這一資訊。包括

目前最大子陣列的起始位置,結束位置,子陣列和

當前正在遍歷的子陣列起始位置,當前位置,當前的和。。

若遍歷到陣列的某一元素,當前和為負,則丟棄當前子陣列,從下乙個元素開始重新計算

若當前遍歷元素<0,則嘗試比較當前子陣列與歷史最大子陣列,決定是否進行更新

在陣列遍歷結束後,比較當前子陣列與歷史最大子陣列,決定最後的結果輸出。

核心**如下,

int max_sub_array(int a,int n,int &left,int &right,int &max)//初始時,left=right=max=0

int cur_left = -1;

int cur_right = cur_max =0;

int index;

for(index =0;index

if(cur_max > max)}

cur_right = index;

cur_max +=a[index];

}上面這些**的邏輯有點問題。。

正確的**如下,

int max_sub_array(int a,int n,int &left,int &right,int &max)

cur_right = index;

cur_max += a[index];

if(cur_max <0)  

continue;

}cur_right = index;

cur_max += a[index];

}if(cur_max > max)      

}

演算法之求最大子陣列

最大子陣列問題暴力求解演算法複雜度2 n 兩種高效方法求最大字陣列問題 問題 求乙個陣列中相加可以獲得最大值的子陣列,子陣列是指原陣列中任意連續的一段 1.遞迴與分治法 複雜度nlogn include using namespace std int max mid int a,int mid,in...

迴圈陣列求最大子陣列

題目 返回乙個整數陣列中最大子陣列的和。要求 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。如果陣列a 0 a j 1 首尾相鄰,允許a i 1 a n 1 a 0 a j 1 之和最大。同時返回最大子陣列的位置。求所有子陣列的和的最大值。要...

求最大子陣列之和

在乙個有n個元素的陣列中,其中每個元素的值可正可負,在該陣列中求乙個連續子陣列,使得該陣列的和最大 拿到這個題首先想到的是暴力法,即暴力迴圈求所有陣列的和,因此可以求的該陣列的最大值,其時間複雜度為o n 3 時間複雜度較高,我們可以用分治法和動態規劃來做這道題。其中分治法時間複雜度為o n log...