文巾解题1588. 所有奇数长度子数组的和
生活随笔
收集整理的這篇文章主要介紹了
文巾解题1588. 所有奇数长度子数组的和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 題目描述
?2 解題思路
2.1 直接求解
枚舉子數組的長度和首位置
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 雙指針
????????首先把問題轉化成,每個數存在在多少個奇數子數組中,也就是每個數重復了多少次。
????????很容易發現數組的第一個數,重復的次數由總長決定。奇數的子數組有多少個呢,正好是(length + 1) // 2。
????????那么前一個數和后一個數是否存在依賴關系呢?
????????觀察到,第一個數組成長度3、5、7等長度的子數組的時候,始終帶著第二個數,但長度為1的時候沒有第二個數出現。
????????
????????同樣的,從第二個數往后面組成的子數組和第一個數沒有關系。
也就是說,第二個數出現了第一個數出現的次數,但是少了第一個數出現、第二個數沒出現的次數。而且第二個數還比第一個數多了第二個數出現、第一個數沒出現的次數。上一個數出現的次數可以記錄。
???????
?????????那么上一個數出現,當前的數沒出現有多少次呢?正好是一個遞歸思想,數組從0到i-1構成多少個包含i-1的子數組,就又是長度計算的。(根據對稱性,這又等于從0到i-1構成多少個包含0的子數組)
????????而當前的數出現,上一個數沒出現,又正好是i到n-1構成多少個包含i的子數組,同樣是長度計算的。
????????于是我們知道以下信息:
- ? ? ? ? 在數組1~n中,第一位出現(n+1)//2次
- ? ? ? ? 當前位比上一位多 (n - i + 1) // 2 - (i + 1) // 2
- ? ? ? ? 首尾對應位置出現次數相同(對稱性)
總結
以上是生活随笔為你收集整理的文巾解题1588. 所有奇数长度子数组的和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 1480. 一维数组的动态和
- 下一篇: NTU 课程 CE7454:信息论概述