2789.合併後陣列中的最大元素
解題思路
- 如果陣列是升序那麼我們就可以得到最大的值,最大的元素就是整個陣列的和
- 那麼透過這個特例我們可以看出只要我們後面的數是一直在增大的,那麼就一定可以成為陣列中的最大元素
- 因此我們要從後面開始遍歷整個陣列,這樣我們就可以得到我們的最大元素
//如果陣列是升序可以得到最大的值,因此要從後面開始合併元素
long long max(long long a, long long b) {
return a >= b? a: b;
}
long long maxArrayValue(int* nums, int numsSize){
if (numsSize == 1) {//如果陣列中只有一個元素,無法合併,那麼它本省就是最大的元素
return nums[0];
}
bool v[100000] = {0};//標記有那些位置被刪除了
long long a[100000];//int型別會溢位所有用long long在存一遍
long long ans = 0;//最終的答案
long long sum = 0;//存放累加和
//複製一份陣列
for (int i = 0; i < numsSize; i ++) {
a[i] = nums[i];
}
//從後面遍歷陣列
for (int i = numsSize - 2; i >= 0; i --) {
if (a[i] <= a[i + 1]) {//如果可以被合併
if (!sum) {//是第一次賦值
sum += a[i] + a[i + 1];
}
else {//不是第一次賦值
sum += a[i];
}
a[i] += a[i + 1];//合併陣列
v[i + 1] = 1;//標記刪除的位置
}
else {//不能合併清空sum的值
sum = 0;
}
ans = max(ans, sum);//ans每次等於最大的數
}
for (int i = 0; i < numsSize; i ++) {//在遍歷一邊陣列,因為可能無法合併所以需要陣列中最大的值
if (!v[i]) {
ans = max(ans, a[i]);
}
}
return ans;
}