53. 最大子陣列和

可阿奇發表於2024-04-18

題目連結:53. 最大子陣列和

這個和560. 和為 K 的子陣列類似,這種求子陣列和用字首和解決較為簡單,字首和的核心思想是用pre[i]表示[0,i]的子陣列和,則[i,j]的子陣列和為pre[j]-pre[i-1]。在560中,遍歷到j時找pre[j]-pre[i-1]=K的子陣列就是找在j之前等於pre[j]-K的字首和,所以要儲存每一步的字首和。

說回本題,要讓子陣列和pre[j]-pre[i-1]最大,遍歷到j時,pre[j]已經固定了,讓pre[i-1]最小即可求出j作為右邊界對應的最大子陣列和,因此在遍歷時要維護一個當前索引之前的最小子陣列和的變數,遍歷每個索引都可以得到一個將其作為右邊界的最小子陣列和,最終取其中最大的即可。程式碼如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int minpre=0;//當前索引j前的最小[0,i](i<j)子陣列和
        int res=-10000;
        int pre=0;
        for(int i:nums){
            pre+=i;//統計字首和            
            res=Math.max(res,pre-minpre);//更新最大子陣列和
            minpre=Math.min(minpre,pre);//更新最小字首子陣列和
        }
        return res;
    }
}

相關文章