日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

        歡迎訪問 生活随笔!

        生活随笔

        當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

        编程问答

        文巾解题1588. 所有奇数长度子数组的和

        發布時間:2025/4/5 编程问答 18 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 文巾解题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
        • ? ? ? ? 首尾對應位置出現次數相同(對稱性)
        class Solution:def sumOddLengthSubarrays(self, arr: List[int]) -> int:l=len(arr)begin, end , ret, times = 0, n - 1, 0, (n+1) // 2while begin <= end:# 對稱性,前后對稱位置出現的次數一樣if begin< end:ret += times * (arr[l] + arr[r])else:ret += times * arr[l]begin += 1end -= 1times += (l- begin + 1) // 2 '''下一個數比前一個數多的部分:后一個數構成的不帶前一個數的奇數子數組的個數也即以下一個數為第一個數,剩余數組中奇數子數組個數'''times -= (begin + 1) // 2'''下一個數比前一個數少的部分:前一個數構成的不帶后一個數的奇數子數組的個數也即第一個數為首個數,到l之前為止,這一個子數組中奇數子數組的個數'''return ret

        總結

        以上是生活随笔為你收集整理的文巾解题1588. 所有奇数长度子数组的和的全部內容,希望文章能夠幫你解決所遇到的問題。

        如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。