文章目录

  • 第85场双周赛
    • T3.字母移位II
    • T4.删除操作后的最大子段和
  • 第307场周赛
    • T2.最大回文数字
    • T3.感染二叉树需要的总时间
    • T4.找出数组的第K大和

第85场双周赛

T1直接暴力枚举所有k长度的区间,统计出修改的最小次数。

T2 调用Java String的replaceAll(String a, String b)方法秒杀

class Solution {public int secondsToRemoveOccurrences(String s) {int res=0;while(s.contains("01")){res++;s=s.replaceAll("01","10");}return res;}
}

T3.字母移位II

这题我是废了脑力的,刚开始想直接暴力,遍历shifts中的所有区间,把移位总数全部统计出来,最后进行移位,直接TLE,才发现这有可能是O(N^2)的时间复杂度。刚好前几天的每日一题,看到宫水三叶大佬提到了差分法,我的另一篇文章算法学习-差分也进行了整理,这道题就是满足「区间修改,单点查询」的性质,因此可以采用差分法做。

class Solution {public String shiftingLetters(String s, int[][] shifts) {int len=s.length();int[]c=new int[len+1];int[]change=new int[len];for(int[]sh:shifts){int start=sh[0],end=sh[1],v=sh[2];c[start]+=v==0?-1:1;c[end+1]+=v==0?1:-1;}change[0]=c[0];for(int i=1;i<len;i++){change[i]=change[i-1]+c[i];}StringBuilder sb=new StringBuilder();for(int i=0;i<len;i++){int shiftnum=change[i]%26;int temp=s.charAt(i)+shiftnum;if(temp<'a'){temp='z'-(Math.abs(temp-'a')-1);}if(temp>'z'){temp='a'+(Math.abs(temp-'z')-1);}sb.append((char)temp);}return sb.toString();}
}

其中可以简化的点是,差分数组的求和可以放在最后遍历改变字符串s的循环中,同时这种循环移位(即z右移变为aa左移变为z)也可以进行简化,即计算相对于a的偏移量:

class Solution {public String shiftingLetters(String s, int[][] shifts) {int len=s.length();int[]c=new int[len+1];int[]change=new int[len];for(int[]sh:shifts){int start=sh[0],end=sh[1],v=sh[2];c[start]+=v==0?-1:1;c[end+1]+=v==0?1:-1;}StringBuilder sb=new StringBuilder();for(int i=0,shiftNum=0;i<len;i++){shiftNum+=c[i];int gap=s.charAt(i)-'a';//+26可以让负数变为相对于'a'的正数,对于正数却无影响int newGap=((gap+shiftNum)%26+26)%26;char res=(char)(newGap+'a');sb.append(res);}return sb.toString();}
}

在计算循环移位字母的时候下面的trick可以重点记住:

int newGap=((gap+shiftNum)%26+26)%26;

进行推广,如果一个长度为n的数组,假定当前下标为i,我们对其向左进行k次「旋转」,最后的下标为:

(i-k+n)%n

T4.删除操作后的最大子段和

看大佬的解法,是并查集的套路题,然而并查集我只草草做了下,如今连模板也不会默写了,看来又是埋坑并查集专题了,连着前两次周赛的数位dp专题和图的深搜专题再次埋坑。贴下灵神的题解。

第307场周赛

这场周赛整个就是掉分状态,做完第一题直接开始摆烂,第二题感觉可以贪心做,但是又不知道如何使得最终结果是回文串。第三题我先建图,然后尝试用深搜做,但是深搜实在不太熟练,不清楚应该怎么记录搜索次数以及base条件。第四题一眼堆,但我也不会堆,整个就是一个坐牢。

T1直接从前往后模拟就好

T2.最大回文数字

直接贪心做法,将回文数字看成前半部分和前半部分的翻转拼接而成(相对于偶数而言,奇数只需要在中间加一个数字就行),长度越长,前半部分的数字越大,最后的回文数字越大。我们只需要先将1-9有偶数个个数的数字尽可能的构成前半部分(因为有偶数个数,所以后半部分反转数字也可以和他对称),同时考虑到不能包含前导0,因此只有当前半部分长度不为0时,才可以加入0。在把偶数对都用完的情况下,就看是否还可以在中间加一个数字,从9-1里面挑个最大的夹在中间。

全为0的时候要进行特判返回“0”

class Solution {public String largestPalindromic(String num) {int[]cnt=new int[10];int len=num.length();for(int i=0;i<len;i++){cnt[num.charAt(i)-'0']++;}//全为0的时候需要进行特判if(cnt[0]==len) return "0";//构成前半部分StringBuilder sb=new StringBuilder();for(int i=9;i>=1;i--){sb.append(String.valueOf(i).repeat(cnt[i]/2));}//判断是否可以加入0if(sb.length()>0) sb.append(String.valueOf(0).repeat(cnt[0]/2));//得到反转的后半部分,但需要new StringBuilder(sb),否则将前半部分也反转了StringBuilder sbreverse=new StringBuilder(sb).reverse();for(int i=9;i>=0;i--){if(cnt[i]%2!=0){sb.append(i);break;}}sb.append(sbreverse);return sb.toString();}
}

T3.感染二叉树需要的总时间

做题的时候就想着两次DFS,第一次递归建立无向图,第二次遍历增加圈数,但是觉得自己无法实现每圈都能找出所有节点,其实就采用类似层序遍历的方法,每次将队列中的节点全部弹出,将相邻节点入栈,由于是无向图,而不是从根到叶子节点有方向的树,所以得做好标记不要重复访问,数组标记或者Set标记都可以。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {HashMap<Integer,HashSet<Integer>> map;public int amountOfTime(TreeNode root, int start) {map=new HashMap<>();buildGraph(root);HashSet<Integer> vis=new HashSet<>();Deque<Integer> que=new ArrayDeque<>();que.offer(start);vis.add(start);int res=-1;while(!que.isEmpty()){res++;int size=que.size();for(int i=0;i<size;i++){int top=que.poll();HashSet<Integer>set=map.get(top);if(set==null) continue;for(int node:set){//不重复访问if(vis.contains(node)) continue;vis.add(node);que.offer(node);}}}return res;}public void buildGraph(TreeNode root){if(root==null) return;if(root.left!=null){HashSet<Integer> set1=map.getOrDefault(root.val,new HashSet<Integer>());HashSet<Integer> set2=map.getOrDefault(root.left.val,new HashSet<Integer>());set1.add(root.left.val);set2.add(root.val);map.put(root.val,set1);map.put(root.left.val,set2);}if(root.right!=null){HashSet<Integer> set1=map.getOrDefault(root.val,new HashSet<Integer>());HashSet<Integer> set2=map.getOrDefault(root.right.val,new HashSet<Integer>());set1.add(root.right.val);set2.add(root.val);map.put(root.val,set1);map.put(root.right.val,set2);}buildGraph(root.left);buildGraph(root.right);}
}

T4.找出数组的第K大和

这题一眼就是用堆做,但无奈自己堆相关的题目实在做得少,先把灵神的题解贴下,堆的专题也得安排起来了呀。

以赛促练-力扣第85场双周赛以及第307场周赛相关推荐

  1. 以赛促练-力扣第303场周赛反思

    从这周开始继续打周赛,尝试以赛促练,以后也想专门记录一下每周周赛一些我不会的题目,以及别人好的思路. 这次又只AC了前两题,基本上就是模拟,没有什么好说的.第三题本来一眼看以为是区间修改,线段树,结果 ...

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

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

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

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

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

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

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

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

  6. 20200727:力扣第31周双周赛题解

    力扣第31周双周赛题解 题目一:在区间范围内统计奇数数目 给你两个非负整数low和high,请你返回low和high之间(包含二者)奇数的数目 0 <= low <= high <= ...

  7. 单调不减序列查询第一个大于等于_[力扣84,85] 单调栈

    题目链接 84. 柱状图中最大的矩形 85. 最大矩形 题目描述-84 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最 ...

  8. 力扣:我的日程安排表I

    package com.算法专练.力扣.我的日程安排表I;import java.util.ArrayList; import java.util.List;/*** @author xnl* @De ...

  9. 第二次力扣周赛:排名149 / 2046;在完赛边缘打转(总结了5点,实力还不够)

    前言: 上午10:30 - 12:00 第二次力扣周赛,最后一题也写完了,但是没有通过.完成了 3 / 4 的题,排名 149 / 2046. 赛题:https://leetcode-cn.com/c ...

最新文章

  1. 图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码
  2. tensorflow 官方文档中文版 tensorflow教程 tensorflow教学
  3. java list 比较_Java中List的五种去重方法及效率对比,你都用对了吗?
  4. Trumb/ARM 指令模式
  5. JVM之堆Heap参数调优入门
  6. spring整合web
  7. mysql source导入慢,MySQL mysqldump与source导入慢怎么解决
  8. 云计算之IaaS 中间件
  9. 2021年中国以太网测试设备市场趋势报告、技术动态创新及2027年市场预测
  10. Linux和windows网络配置
  11. hdu 4324 Triangle LOVE 拓扑排序 多校联合赛(三)第四题
  12. 把AspDotNetCoreMvc程序运行在Docker上-part3:使用独立的存储容器
  13. c#的装箱和拆箱及值类型和引用类型
  14. 小凡的Python之路——安装
  15. java jpg转换成pdf格式_Java pdf和jpg互转案例
  16. matlab建模与仿真应用pdf,MATLAB建模与仿真应用教程 第2版
  17. PAT 乙级 1055  集体照
  18. 播放器只有图像没有声音的解决方案
  19. Enhance Security with Port Knocking
  20. Flutter 仿滴滴出行App,2021最新华为Android校招面试题

热门文章

  1. 点灯科技 小爱开关灯
  2. 凡泰极客与AnyChat强强联手,共创智慧金融新体验!
  3. 等差数列java用等差公式写_等差数列求和公式及推导方法
  4. 【配送路径规划】基于matlab蚁群优化节约算法单中心多城市配送车辆路径规划【含Matlab源码 017期】
  5. 夺命雷公狗---大型网站架构技术一览
  6. 前端使用print.js实现打印
  7. jira是干什么_JIRA简介
  8. [附源码]Python计算机毕业设计SSM健身俱乐部管理系统(程序+LW)
  9. 基于javaweb+mysql的健身房健身俱乐部管理系统(前台、后台)
  10. docker部署禅道报错 WARNING: IPv4 forwarding is disabled. Networking will not work.