力扣第31周双周赛题解

题目一:在区间范围内统计奇数数目

给你两个非负整数low和high,请你返回low和high之间(包含二者)奇数的数目

0 <= low <= high <= 10^9

示例

输入:low = 3,high = 7

输出: 3

解释:3到7之间的奇数有3,5,7共3个。

解题思路

思路无非两种,一,直接模拟,二,寻找规律。

不假思索的模拟方法为:分出四类,low high组合,奇偶,奇奇,偶偶,偶奇,即可完成代码。在不需要花太多时间的第一题如果你没思路,那么完全可以这样做,代码量也不大。

第二种方法就是在上一种思路上再推一步,我们直接固定下区间,分别获取到从0开始分别到low和high的范围内的所有奇数个数,再两者相减,即可得到我们的目标值。

以上述示例说明:0-3的奇数个数为3 / 2 + 1= 2 ,0-7的奇数个数为7/2 + 1 = 4,加不加1取决于高位这个数是否为奇数,若为奇数则加1,不是则不加。注意包含high和low本身的数,因此实际上我们相当于漏掉了low这个值的奇偶性,因此再加上一个low % 2即可。写入代码你会发现实际上会将low%2约掉,也就是说low和high之间的奇数总数跟low的奇偶没有关系。因此最终优化代码如下。

代码实现

class Solution {public int countOdds(int low,int high) {int Hcount = high / 2 + high % 2;// int Lcount = low / 2 + low % 2;int Lcount = low / 2 + low % 2;// return Hcount - Lcount;return Hcount - Lcount;}
}

题目二:和为奇数的子数组数目

给你一个整数数组arr,请你返回和为奇数的子数组数目。

答案比较大,因此请你返回将结果对10^9+7取余的结果。

1 <= arr.length <= 10^5

1 <= arr[i] <= 100

示例

输入: arr = [1,3,5]

输出: 4

解释:子数组为[[1],[3],[5],[1,3],[1,5],[3,5],[1,3,5]]共7个,

其和为1,3,5,4,6,8,9,

奇数包括1,3,5,9

共4个因此返回4.

解题思路

  1. 首先根据arr的长度为一万以内,因此可以排除暴力的方法。必定TLE。再仔细一看本题可以使用动态规划的解答。
  2. 具体如下:和为奇数的子数组的数目。那么对应一个和为偶数的子数组的数目,二者互斥。因此定义dp [i] [0]和dp [i]
    [1]分别为以arr[i]结尾的子数组和为奇数和偶数的数目。
  3. 考虑我们从前面往后面推,先给出base case为dp[0] [0] = (arr[i] % 2 == 1)
  4. 考虑状态转移:如果arr[i]为偶数,那么dp [i] [0] = dp [i - 1] [0],dp[i] [1] = dp [i -1] [1] + 1
    如果arr[i]为奇数,那么dp [i] [0] = dp [i - 1] [1] + 1,dp [i] [1] = dp [i - 1] [0] 。
  5. 最后统计dp[0] [0] + … + dp [arr.length - 1] [0]即为结果。

代码实现

class Solution {public int numOfSubarrays(int[] arr) {final int VAL = 1000000007;int res = 0;int[][] dp = new int[arr.length][2];// base caseif (arr[0] % 2 == 1) {dp[0][0] = 1;} else {dp[0][1] = 1;}// 状态转移for (int i = 1; i < arr.length; 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 j = 0; j < arr.length; j++) {res += dp[j][0];res %= VAL;}return res;}
}

题目三:字符串的好分割数目

给你一个字符串s,一个分割被称为好分割的定义是:当它满足将s分为两个字符串p和q,连起来等于s,且p和q中不同字符的数目相同。

请你返回s中好分割的数目。

示例

输入:s = “aacaba”

输出:2

解释:aac aba和aaca,ba两种分法满足好分割的要求。返回2

解题思路

将字符串分为两部分,分别统计两部分的不同字母的数量,然后分割线从左边开始,找到好分割点则ans++即可。

代码实现

class Solution {public int numSplits(String s) {int res = 0;int lCount = 0,rCount = 0;// 初始化左右两边的数组,数组索引对应具体字母,数组值对应字母出现次数。int[] left = new int[26];int[] right = new int[26];// 分割线从左边开始,默认所有元素都在右边for (int i = 0; i < s.length(); i++) {int index = s.charAt(i) - 'a';if (right[index] == 0) {rCount++;}right[index]++;}// 开始移动分割线,每次移动一个元素到左边,先更新left数组,再更新lCount,再更新right数组,再更新rCount,最后再判断是否满足条件。for (int j = 0; j < s.length(); j++) {int index1 = s.charAt(j) - 'a';if (left[index1] == 0) {lCount++;}left[index1]++;right[index1]--;if (right[index1] == 0) {rCount--;}if (lCount == Rcount) {res++;}}return res;}
}

题目四:形成目标数组的子数组最少增加次数

给你一个整数数组target和一个数组initial,initial数组与target数组有同样的维度,且一开始全部为0。

请你返回从initial到target的最少操作次数,每次操作需遵循以下规则:

​ 在initial中选择任意子数组,并将子数组的每个元素+1。

答案保证在32位有符号整数以内。

示例

输入: target = [1,2,3,2,1]

输出: 3

解释:从[0,0,0,0,0] -> [1,1,1,1,1] ->[1,2,2,2,1] ->[1,2,3,2,1] 共3次。

解题思路

本题可以是一个波峰问题的原型题目,比如示例,给的就是一个山峰,从1爬山到3再下山到1,因为你需要从0开始加,且每次只能加1,那么思路就显而易见了,计算那个爬山或者下山的过程即可。我们以爬山为例进行代码实现即可。

代码实现

class Solution {public int minNumOperations(int[] target) {// 题目未限定target的长度,因此需要特数情况处理,注意细节if (target.length == 0 || target == null) {return 0;}int res = target[0];for (int i = 1; i < target.length; i++) {res += Math.max(target[i] - target[i - 1], 0);}  return res;}
}

20200727:力扣第31周双周赛题解相关推荐

  1. 20200827:2020力扣第33周双周赛题解

    2020力扣第33周双周赛题解 题目一 示例 解题思路与代码实现 题目二 示例 解题思路与代码实现 题目三 解题思路与代码实现 题目四 示例 解题思路与代码实现 写在最后 题目一 题目一:千位分隔数 ...

  2. 20211201:力扣第268周双周赛(上)

    力扣第268周双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 两栋颜色不同且距离最远的房子 给植物浇水 思路与算法 双指针遍历即可,维护那个索引最大差值即可. 模拟题,正常情况需要每次走一步 ...

  3. 20210119:力扣第42周双周赛(下)

    力扣第42周双周赛(下) 题目 思路与算法 代码实现 写在最后 题目 修改后的最大二进制字符串 得到连续 K 个 1 的最少相邻交换次数 思路与算法 修改后的最大二进制字符串 这道题的思路很简单,交换 ...

  4. 20210101:力扣第42周双周赛(上)

    力扣第42周双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 无法吃午餐的学生数量 平均等待时间 思路与算法 无法吃午餐的学生数量 本题直接暴力模拟也没问题,但是这应该不是题目的本意,我们可以 ...

  5. 20210530:力扣第53场双周赛题解

    力扣第53场双周赛题解 题目 思路与算法 代码实现 写在最后 题目 长度为三且各字符不同的子字符串 数组中最大数对和的最小值 矩阵中最大的三个菱形和 思路与算法 长度为三且各字符不同的子字符串:遍历查 ...

  6. 20220219:力扣第72场双周赛题解

    力扣第72场双周赛 题目 思路与算法 代码实现 写在最后 题目 统计数组中相等且可以被整除的数对 找到和为给定整数的三个连续整数 拆分成最多数目的偶整数之和 统计数组中好三元组数目 思路与算法 前三题 ...

  7. 20201023:力扣第37场双周赛(上)

    力扣第37场双周赛(上) 题目 思路与算法 代码实现 写在最后 题目 删除某些元素后的数组均值 网络信号最好的坐标 思路与算法 第二题直接暴力就可以了,计算每个点的所有偏移量存入list,即以(0,0 ...

  8. 20200922:leetcode35周双周赛题解记录(下)

    leetcode35周双周赛题解记录(下) 题目 思路与算法 代码实现 复杂度分析 题目 3.1590. 使数组和能被 P 整除 4.1591. 奇怪的打印机 II 思路与算法 第三题前缀和衍生题目, ...

  9. 20200920:leetcode35周双周赛题解(上)

    leetcode35周双周赛题解(上) 题目 思路与算法 代码实现 写在最后 题目 1.5503. 所有奇数长度子数组的和 2.5505. 所有排列中的最大和 思路与算法 第一题暴力就行了,看了很多大 ...

最新文章

  1. 理解GRUB2工作原理及配置选项与方法
  2. 携程是如何把大数据用于实时风控的
  3. h5 客服系统源码_Bos:做在线客服系统项目(附源码)
  4. 大厂十年IT老兵血泪教训,IT人到底要如何选择合适的报表工具?
  5. 三、MySql 数据类型
  6. 计算机怎么删除表格,EXCEL如何删除表格内容中的部分文本
  7. 比特率控制模式ABR、VBR、CBR
  8. JavaScript (05)-大话JS,屌丝逆袭(四)
  9. 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵
  10. 地球引擎中级教程——地球引擎对象(含练习)
  11. 在ie edge中消除默认出现的密码框小眼睛标志
  12. 谈谈Line-height的深入理解 与 应用
  13. 傅雷家书与互联网从业者的思考
  14. java实现“两数之和”
  15. 全国计算机等级考试照片多大的,2018年全国计算机等级考试报名照片要求
  16. Gartner 网络研讨会 “九问数字化转型” 会后感
  17. Echarts中国地图的china.js下载
  18. 计算机专业英语BD,计算机专业英语
  19. JavaMail怎样获取收件箱,发件箱,垃圾箱等等的全名
  20. 旋转变压器简介、工作原理及分类

热门文章

  1. 开源风云 20 年!
  2. 微信小程序发力搜索,开发者变现难,揭秘小程序行业真实现状
  3. 遇冷的斗鱼直播,还“斗”得动吗?| 畅言
  4. 看动画轻松理解「Trie树」
  5. 京东末位淘汰 10% 高管:稳定不是常态,淘汰才是
  6. 万维网之父:Facebook、Google 等硅谷巨头必须被拆分!
  7. Facebook开源多款AI工具,支持游戏、翻译
  8. 2018 区块链技术及应用峰会(BTA)·中国在北京盛大召开
  9. 苹果说:没错,我就是故意让旧 iPhone 变慢的!
  10. 查漏补缺!java主要包括哪几种开发平台