[周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]
【問題描述】5457. 和為奇數的子數組數目[中等]
【解答思路】
1. 動態規劃
第 1 步:設計狀態
 dp[i][0] 記錄以arr[i]結尾的和為奇數數量
 dp[i][1] 記錄以arr[i]結尾的和為偶數數量
 第 2 步:狀態轉移方程
第 3 步:考慮初始化
if(arr[0]%2==1){dp[0][0]=1;}else{dp[0][1]=1;}第 4 步:考慮輸出
 遍歷dp[i][0]相加
時間復雜度:O(N^2) 空間復雜度:O(1)
static int base=1000000007;public int numOfSubarrays(int[] arr) {int n=arr.length;int res=0;int[][] dp=new int[n][2];if(arr[0]%2==1){dp[0][0]=1;}else{dp[0][1]=1;}for(int i=1;i<n;i++){if(arr[i]%2==0){dp[i][0]=dp[i-1][0];dp[i][1]=dp[i-1][1]+1;}else{dp[i][0]=dp[i-1][1]+1;dp[i][1]=dp[i-1][0];}}for(int[] k:dp){res=(res+k[0])%base;}return res;}2. 前綴和(和動態規劃類似)
如果當前的和為1,那么找到前綴和為0的,在這一段中,和就為奇數
 因為前綴和為0的變成前綴和為1的,加上當前的數肯定是一個奇數
 同理,如果當前的和為0,那么找到前綴和為1的,在這一段中,和就為奇數
 我們只需要統計前綴和為0和1的個數即可
 時間復雜度:O(N) 空間復雜度:O(1)
【總結】
1. 動態規劃流程
第 1 步:設計狀態
 第 2 步:狀態轉移方程
 第 3 步:考慮初始化
 第 4 步:考慮輸出
 第 5 步:考慮是否可以狀態壓縮
2.前綴和 想清楚狀態轉移
3. 一開始思路 遍歷子序列 后發現有重復和 瞎搞了一個多小時 原來有更好的方法 不打周賽都不知道自己有多菜
轉載鏈接:https://leetcode-cn.com/problems/number-of-sub-arrays-with-odd-sum/solution/dong-tai-gui-hua-by-zhan-zai-yue-guang-xia-3/
 轉載鏈接:https://leetcode-cn.com/problems/number-of-good-ways-to-split-a-string/solution/javaer-fen-by-dui-fang-zheng-zai-jiang-hua-2/
總結
以上是生活随笔為你收集整理的[周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 基于OpenVINO的端到端DL网络-初
 - 下一篇: ATS读小文件(内存命中)