2024年3月14號題解

lwj1239發表於2024-03-14

2789.合併後陣列中的最大元素

解題思路

  1. 如果陣列是升序那麼我們就可以得到最大的值,最大的元素就是整個陣列的和
  2. 那麼透過這個特例我們可以看出只要我們後面的數是一直在增大的,那麼就一定可以成為陣列中的最大元素
  3. 因此我們要從後面開始遍歷整個陣列,這樣我們就可以得到我們的最大元素
//如果陣列是升序可以得到最大的值,因此要從後面開始合併元素
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;
}