[リコウ] 1588. すべての奇数長部分配列の合計
正の整数の配列 arr を指定して、奇数長のすべての可能な部分配列の合計を計算します。サブ配列は、元の配列の連続したサブシーケンスとして定義されます。すべての奇数長の部分配列の合計を arr に返してください。
例 1:
入力: arr = [1,4,2,5,3]
出力: 58
説明: すべての奇数長の部分配列とその合計は次のとおりです:
[1] = 1
[4] = 4
[2] = 2
[ 5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
us すべての合計値は 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58 となります。
例 2:
入力: arr = [1,2]
出力: 3
説明: 奇数長のサブ配列は [1] と [2] の 2 つだけです。それらの合計は 3 です。
例 3:
入力: arr = [10,11,12]
出力: 66
ヒント:
1 <= arr.length <= 100
1 <= arr[i] <= 1000
答え
添字 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
元の配列 | 1 | 4 | 2 | 5 | 3 | |
プレフィックスの合計 | 0 | 1 | 5 | 7 | 12 | 15 |
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int[] s = new int[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
s[i + 1] = s[i] + arr[i];
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int length = 1; i + length <= arr.length; length += 2) {
int right = i + length ;
int left = i;
sum += s[right] - s[left];
}
}
return sum;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] testArry = {
1, 4, 2, 5, 3};
System.out.println(solution.sumOddLengthSubarrays(testArry));
}
}