文巾解题1588. 所有奇数长度子数组的和
1 題目描述
?2 解題思路
2.1 直接求解
枚舉子數(shù)組的長度和首位置
class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)ret=0for i in range(1,l+1,2):for j in range(l-i+1):ret+=sum(arr[j:j+i])return(ret)2.2 直接求解+前綴和
class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)s=[0]for i in arr:s.append(s[-1]+i)ret=0for i in range(1,l+1,2):#子序列長度1~l,每次增長2for j in range(l-i+1):#子序列起始點,最大為l-i(此時的終點為l-i+i-1=l-1)ret+=s[i+j]-s[j]return(ret)2.3 雙指針
????????首先把問題轉(zhuǎn)化成,每個數(shù)存在在多少個奇數(shù)子數(shù)組中,也就是每個數(shù)重復(fù)了多少次。
????????很容易發(fā)現(xiàn)數(shù)組的第一個數(shù),重復(fù)的次數(shù)由總長決定。奇數(shù)的子數(shù)組有多少個呢,正好是(length + 1) // 2。
????????那么前一個數(shù)和后一個數(shù)是否存在依賴關(guān)系呢?
????????觀察到,第一個數(shù)組成長度3、5、7等長度的子數(shù)組的時候,始終帶著第二個數(shù),但長度為1的時候沒有第二個數(shù)出現(xiàn)。
????????
????????同樣的,從第二個數(shù)往后面組成的子數(shù)組和第一個數(shù)沒有關(guān)系。
也就是說,第二個數(shù)出現(xiàn)了第一個數(shù)出現(xiàn)的次數(shù),但是少了第一個數(shù)出現(xiàn)、第二個數(shù)沒出現(xiàn)的次數(shù)。而且第二個數(shù)還比第一個數(shù)多了第二個數(shù)出現(xiàn)、第一個數(shù)沒出現(xiàn)的次數(shù)。上一個數(shù)出現(xiàn)的次數(shù)可以記錄。
???????
?????????那么上一個數(shù)出現(xiàn),當(dāng)前的數(shù)沒出現(xiàn)有多少次呢?正好是一個遞歸思想,數(shù)組從0到i-1構(gòu)成多少個包含i-1的子數(shù)組,就又是長度計算的。(根據(jù)對稱性,這又等于從0到i-1構(gòu)成多少個包含0的子數(shù)組)
????????而當(dāng)前的數(shù)出現(xiàn),上一個數(shù)沒出現(xiàn),又正好是i到n-1構(gòu)成多少個包含i的子數(shù)組,同樣是長度計算的。
????????于是我們知道以下信息:
- ? ? ? ? 在數(shù)組1~n中,第一位出現(xiàn)(n+1)//2次
- ? ? ? ? 當(dāng)前位比上一位多 (n - i + 1) // 2 - (i + 1) // 2
- ? ? ? ? 首尾對應(yīng)位置出現(xiàn)次數(shù)相同(對稱性)
總結(jié)
以上是生活随笔為你收集整理的文巾解题1588. 所有奇数长度子数组的和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 1480. 一维数组的动态和
- 下一篇: NTU 课程 CE7454:信息论概述