【问题描述】5457. 和为奇数的子数组数目[中等]

【解答思路】

1. 动态规划

第 1 步:设计状态
dp[i][0] 记录以arr[i]结尾的和为奇数数量
dp[i][1] 记录以arr[i]结尾的和为偶数数量
第 2 步:状态转移方程

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];}}

第 3 步:考虑初始化

if(arr[0]%2==1){dp[0][0]=1;}else{dp[0][1]=1;}

第 4 步:考虑输出
遍历dp[i][0]相加

 for(int[] k:dp){res=(res+k[0])%base;}return res;

时间复杂度: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)

class Solution {public int numOfSubarrays(int[] arr) {int[] cnts = new int[2];int cur = 0;int ans = 0;cnts[0] = 1;int mod = 1000000007;for(int x : arr){//查看当前的前缀和cur = (cur + x) % 2;//结果加上前缀和相反的个数ans += cnts[1 - cur];//前缀和为cur的个数++cnts[cur]++;ans %= mod;}return  ans % mod;}
}

【总结】

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][动态规划][和为奇数的子数组数目]相关推荐

  1. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  2. [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...

  3. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  4. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  5. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  6. [Leetcode][第216题][JAVA][数组之和3][回溯]

    [问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...

  7. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  8. [Leetcode][第77题][JAVA][组合][回溯]

    [问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...

  9. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

最新文章

  1. 小辣椒p60手机怎么样_手机推荐:小辣椒手机彻底爆发,6+128仅699,还要啥自行车?...
  2. Mac的控制台命令无法使用command not found
  3. 30分钟时长千行代码《C#程序设计基础》经典程序,C#菜鸟开发必备!
  4. android 字体颜色选择,Android中颜色选择器和改变字体颜色的实例教程
  5. 手机 modem开发(22)---modem 通信 -- 几模 几频
  6. 项目记录 Gadget桌面帮助系统
  7. ecos中的spl同步机制
  8. Laravel测试驱动开发--功能测试 1
  9. IPSec Over GRE和GRE Over IPSec技术
  10. HTML table 标签的 summary 属性
  11. 2018.5.1 差分放大电路实验
  12. 求各位大神帮忙看一下我用51做的万年历程序有没有问题
  13. android 壁纸改变回调,android_launcher的源码详细分析和壁纸修改
  14. 人工智能 —— 归结演绎推理
  15. 2020语数外百度网盘小学全集下载
  16. HTML(常用标签与超链接)的案例
  17. dotproject安装问题
  18. 做新媒体运营,如何提高文案写作能力?掌握这4个技巧就够了
  19. 易语言多线程批量登录实现一键选中取消选择框账号
  20. 进入PE系统蓝屏--解决办法之一

热门文章

  1. cocos2dX 之数据存储
  2. iOS原生CIFilter创建二维码
  3. 分布式文件系统虚拟目录及命名空间的实现方法
  4. .Net Excel 部分操作
  5. post提交,WPF,Silverlight(加深记忆写一遍)
  6. Spring AOP学习笔记
  7. c语言 字符串map,C语言实现BitMap
  8. linux vue node占用内存过大,vue 大型应用内存泄漏改造经验
  9. Ant Design Form.Item的label中文字换行的替代方式
  10. CDH集群异常处理ERROR  Failure due to stall on seeded torrent.、重装时hdfs提示目录已存在、CDH重启不正常