【LeetCode】统计「优美子数组」Java 题解
题目描述
给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
复制代码
思路分析
今天的算法每日一题是统计优美子数组,题目给出了定义如果某个 连续 子数组中恰好有 k 个奇数数字。因此,我们只需要关注奇数即可。如何区分数字的奇偶性呢?我们只需要 num % 2 取余,偶数的余数是 0,奇数的余数是 1。
题目要求返回请返回这个数组中「优美子数组」的数目。因此,我们只需要关注数目,不需要枚举每一个优美子数组。上一步,我们将 nums 转换为基偶数,降低了计算的复杂度。这里可以用前缀和的思想来统计,因为偶数的余数是 0,奇数的余数是 1。所以前缀和,统计的就是奇数出现的次数。
上面的思路大家都是清晰的,有同学对 cnt[] 这种缓存方式有疑问? 这里的 cnt[] 就是当缓存使用,我们常用的缓存是 map。cnt[] 一般是存储数字类的缓存,占用空间小,效率高。而 map 这种,缓存的 key 可以是数字,也可以是字符串,更加灵活一些。
对于 cnt 这种用法,我们可以参考一个简单的题目,有效的字母异位词, 来帮助你理解。
复制代码
在有效的字母异位词题目中,cnt 用来统计字符出现的次数。提升算法执行效率。
通过代码
复制代码
总结
上述算法的时间复杂度是 O(n),空间复杂度是 O(n)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【HQ数字卡】的原创文章。
原文链接:【http://xie.infoq.cn/article/6a51a88eeafdf125d89d2e1e9】。文章转载请联系作者。
评论