2024年3月14号题解
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;
}