/**
* 动态规划,计算出非环形数组各项的最大值
* 环形数据最大和子集考虑两种情况
* 该子集横跨与不横跨
* 横跨时,反向求解总和减去最小值
*
* @param nums int整型一维数组
* @return int整型
*/
export function maxSubarraySumCircular(nums: number[]): number {
const maxList = Array(nums.length).fill(0);
const minList = Array(nums.length).fill(0);
let sum = 0;
nums.forEach(( item,index )=>{
sum+=item;
if((maxList[index -1] || 0 ) < 0){
maxList[index] = nums[index]
} else{
maxList[index] = (maxList[index - 1] || 0) + nums[index];
}
if((minList[index -1] || 0 ) > 0){
minList[index] = nums[index]
} else{
minList[index] = (minList[index - 1] || 0) + nums[index];
}
})
if(sum === Math.min(...minList)){
return Math.max(...maxList)
}
const max= sum - Math.min(...minList)
return Math.max(max, ...maxList)
}