lLeeCode最優題解收錄:1588.所有奇數長度子陣列的和

筱寒小記發表於2020-11-21

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

題解如下:

//以{1,2,3,4,5}為例,計算i為某確定值時候對應arr[i]出現的總次數。
public int sumOddLengthSubarrays(int[] arr) {
    int sum = 0;
    int len = arr.length;
    for (int i = 0; i < arr.length; i++) {
        //當i = 2時候,arr[2] = 3,左邊有2個元素1,2,
        //需要保證連續,則取元素方式如下:
        //取0個:{3}
        //取1個:只取一個元素2.則{2,3}
        //取2個:取2個元素1和2,則{1,2,3}
        //所以有3種情況就是2+1種情況,也就是i+1種情況
        int left = i + 1;
        //右邊元素個數為:len-(i+1)個
        //同理可得
        int right = len - (i + 1) + 1;
        //左邊取的元素個數0,1,2;則只有1為奇數,可得左邊取奇數個元素的方式:
        int left_odd = left / 2;
        //左邊取的元素個數0,1,2;則偶數為0個或者2個,可得左邊取偶數個元素的方式:
        int left_even = (left + 1) / 2;
        //同上,右邊取奇數個元素的方式
        int right_odd = right / 2;
        //同上,右邊取偶數個元素的方式
        int right_even = (right + 1) / 2;
        //左邊取任意奇數個同時右邊取任意奇數個加上自身,一共奇數個。任意組合所以是乘法。
        //左邊取任意偶數個同時右邊取任意偶數個加上自身,一共奇數個。
        //注意包含左右各取0個。
        sum += arr[i] * (left_odd * right_odd + left_even * right_even);
    }
    return sum;
}

參考文章:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays/solution/jie-shi-de-dian-luo-suo-bu-guo-ying-gai-hao-li-jie/

相關文章