[周赛][Leetcode][第5457题][JAVA][动态规划][和为奇数的子数组数目]
【问题描述】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][动态规划][和为奇数的子数组数目]相关推荐
- [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]
[问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...
- [Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]
[问题描述][中等] [解答思路] public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) { ...
- [Leetcode][第78题][JAVA][子集][位运算][回溯]
[问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
[问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...
- [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]
[问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...
- [Leetcode][第216题][JAVA][数组之和3][回溯]
[问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- [Leetcode][第77题][JAVA][组合][回溯]
[问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...
- [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
[问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...
最新文章
- 小辣椒p60手机怎么样_手机推荐:小辣椒手机彻底爆发,6+128仅699,还要啥自行车?...
- Mac的控制台命令无法使用command not found
- 30分钟时长千行代码《C#程序设计基础》经典程序,C#菜鸟开发必备!
- android 字体颜色选择,Android中颜色选择器和改变字体颜色的实例教程
- 手机 modem开发(22)---modem 通信 -- 几模 几频
- 项目记录 Gadget桌面帮助系统
- ecos中的spl同步机制
- Laravel测试驱动开发--功能测试 1
- IPSec Over GRE和GRE Over IPSec技术
- HTML table 标签的 summary 属性
- 2018.5.1 差分放大电路实验
- 求各位大神帮忙看一下我用51做的万年历程序有没有问题
- android 壁纸改变回调,android_launcher的源码详细分析和壁纸修改
- 人工智能 —— 归结演绎推理
- 2020语数外百度网盘小学全集下载
- HTML(常用标签与超链接)的案例
- dotproject安装问题
- 做新媒体运营,如何提高文案写作能力?掌握这4个技巧就够了
- 易语言多线程批量登录实现一键选中取消选择框账号
- 进入PE系统蓝屏--解决办法之一
热门文章
- cocos2dX 之数据存储
- iOS原生CIFilter创建二维码
- 分布式文件系统虚拟目录及命名空间的实现方法
- .Net Excel 部分操作
- post提交,WPF,Silverlight(加深记忆写一遍)
- Spring AOP学习笔记
- c语言 字符串map,C语言实现BitMap
- linux vue node占用内存过大,vue 大型应用内存泄漏改造经验
- Ant Design Form.Item的label中文字换行的替代方式
- CDH集群异常处理ERROR Failure due to stall on seeded torrent.、重装时hdfs提示目录已存在、CDH重启不正常