【leetcode 春季比赛3题 二叉搜索树染色】广度搜索
暴力:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeSet; /**
* Definition for a binary tree node. public class TreeNode { int val; TreeNode
* left; TreeNode right; TreeNode(int x) { val = x; } }
*/
/**
* [64,22,92,18,52,67,null,8,null,27,59,null,68,0,null,null,30,null,null,null,91]
* [[0,27,30],[1,18,91],[0,18,59]]
* @author butterfly
*
*/
class Solution {
public static void main(String[] args) {
TreeNode root = new TreeNode(64); root.right = new TreeNode(92);
root.left = new TreeNode(22); root.left.left = new TreeNode(18);
root.left.right = new TreeNode(52);
root.right.left = new TreeNode(67); root.left.left.left = new TreeNode(8);
root.left.right.left = new TreeNode(27);
root.left.right.right =new TreeNode(59);
root.right.left.right = new TreeNode(68);
root.left.left.left.left = new TreeNode(0);
root.left.right.left.right = new TreeNode(30);
root.right.left.right.right = new TreeNode(91); Solution solution = new Solution();
int ans = solution.getNumber(root, new int[][]{
{0,27,30},{1,18,91},{0,18,59}
});
System.out.println(ans);
}
Map<Integer, Integer> idxMap = new HashMap<>(); class Range {
int start;
int end; @Override
public int hashCode() {
return Objects.hash(this);
} @Override
public boolean equals(Object obj) {
Range other = (Range) obj;
if (end != other.end)
return false;
if (start != other.start)
return false;
return true;
} public Range(int start, int end) {
this.start = start;
this.end = end;
} boolean contains(Range range) {
if (this.start <= range.start && range.end <=this.end) {
return true;
}
return false;
} boolean hasJiaoji(Range range) {
if (range.start >= this.start && range.start <= this.end) {
return true;
}
if (range.end >= this.start && range.end <= this.end) {
return true;
}
return false;
} Range chaji(Range range) {
if (range.start >= this.start && range.start <= this.end) {
return new Range(this.start, range.start - 1);
} else if (range.end >= this.start && range.end <= this.end) {
return new Range(range.end + 1, this.end);
}
return null;
} List<Range> chaji2(Range range){
List<Range> list = new ArrayList<>();
if( this.contains(range)){
if(this.start < range.start) {
list.add(new Range(this.start,range.start-1));
}
if( this.end > range.end){
list.add(new Range(range.end+1,this.end));
}
return list;
}
return null;
} Range union(Range range) {
if (contains(range)) {
return new Range(range.start,range.end);
} else if (range.contains(this)) {
return new Range(this.start,this.end);
} else if (hasJiaoji(range)) {
if (range.start >= this.start && range.start <= this.end) {
return new Range(this.start, range.end);
} else {
return new Range(range.start, this.end);
}
} else {
return null;
}
} private Solution getOuterType() {
return Solution.this;
} } void travel(List<Integer> list, TreeNode root) {
if (root != null) {
list.add(root.val);
travel(list, root.left);
travel(list, root.right);
}
} public int getNumber(TreeNode root, int[][] ops) {
List<Integer> list = new ArrayList();
travel(list, root);
Collections.sort(list);
idxMap = new HashMap();
for (int i = 0; i < list.size(); i++) {
idxMap.put(list.get(i), i);
} TreeSet<Range> redRangeList = new TreeSet<>(new Comparator<Range>() { @Override
public int compare(Range o1, Range o2) {
return o1.start - o2.start;
}
}); for (int i = 0; i < ops.length; i++) {
int type = ops[i][0];
int s = ops[i][1];
int e = ops[i][2]; int start = idxMap.get(s);
int end = idxMap.get(e); if (type == 0) {
if (redRangeList.size() == 0) {
continue;
} Range lanRange = new Range(start, end);
Iterator<Range> it = redRangeList.iterator();
while (it.hasNext()) {
Range redRange = it.next();
if (lanRange.contains(redRange)) {
it.remove();
}
if (redRange.start > lanRange.end) {
break;
}
} if (redRangeList.size() == 0) {
continue;
} List<Range> added = new ArrayList<>();
boolean flag = false;
it = redRangeList.iterator();
while (it.hasNext()) {
Range range = it.next();
if (range.start > lanRange.end) {
break;
}
if(range.contains(lanRange)) {
flag = true;
List<Range> tmp = range.chaji2(lanRange);
it.remove();
added.addAll(tmp);
}
else if( range.hasJiaoji(lanRange) ){
flag = true;
Range toAdd = range.chaji(lanRange);
added.add(toAdd);
it.remove();
}
}
for(Range add:added){
redRangeList.add(add);
}
if (!flag) {
// 都没有交集
}
}
if (type == 1) {
Range newRedRange = new Range(start, end);
Iterator<Range> it = redRangeList.iterator();
while (it.hasNext()) {
Range redRange = it.next();
if (newRedRange.contains(redRange)) {
it.remove();
}
if (redRange.start > newRedRange.end) {
break;
}
}
//
boolean flag = true;
it = redRangeList.iterator();
while (it.hasNext()) {
Range range = it.next();
if (range.start > newRedRange.end) {
break;
}
if( range.contains(newRedRange)) {
flag = false;
break;
}
else if( range.hasJiaoji(newRedRange)){
Range toAdd = range.union(newRedRange);
it.remove();
newRedRange = new Range(toAdd.start,toAdd.end);
}
}
if(flag)
redRangeList.add(newRedRange);
}
}
int ans = 0;
for(Range range:redRangeList){
ans +=(range.end - range.start+1);
} return ans;
}
}
【leetcode 春季比赛3题 二叉搜索树染色】广度搜索的更多相关文章
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- LeetCode 95 | 构造出所有二叉搜索树
今天是LeetCode专题第61篇文章,我们一起来看的是LeetCode95题,Unique Binary Search Trees II(不同的二叉搜索树II). 这道题的官方难度是Medium,点 ...
- C# leetcode 之 096 不同的二叉搜索树
C# leetcode 之 096 不同的二叉搜索树 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 二叉搜索树定义 左子树上所有节点的值小于根节点, 右子树上左右 ...
- Leetcode:96. 不同的二叉搜索树
Leetcode:96. 不同的二叉搜索树 Leetcode:96. 不同的二叉搜索树 题目在链接中,点进去看看吧! 先介绍一个名词:卡特兰数 卡特兰数 卡特兰数Cn满足以下递推关系: \[ C_{n ...
- C#LeetCode刷题-二叉搜索树
二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III 19.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 327 区间和的个数 29.5% 困难 3 ...
- 【leetcode 简单】 第六十八题 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...
- [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [LeetCode] 109. 有序链表转换二叉搜索树
题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...
- [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
随机推荐
- VSCode实现GDB图形界面远程调试
前言 在习惯了集成开发环境的图形界面调试时,首次使用GDB远程调试必定很不习惯,下面讲述如何利用VSCode实现GDB图形界面远程调试 代码在Linux服务器上,而平常都在Windows上使用,那么V ...
- 洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考
[NOIP2011 普及组] 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能 ...
- .NET中使用BootstrapBlazor组件库Table实操篇
前言 Table表格在后台管理应用中使用的是相当频繁的,因此找一个功能齐全的前端框架对于我们而言是非常必要的,因为封装完善的前端框架能够大大提升我们的工作对接效率.今天我们主要来讲解一下在.NET中使 ...
- 安装Electron时卡在install.js不动的解决方案
问题来源,发现即使 源切换成淘宝的之后,安装 electron的时候还是慢死,郁闷,后来百度才发现,原来,还需要设置一个地方!!! 经过试验,果然快了 爽.... 之前在安装Electron的时候,经 ...
- zookeeper源码(08)请求处理及数据读写流程
ServerCnxnFactory 用于接收客户端连接.管理客户端session.处理客户端请求. ServerCnxn抽象类 代表一个客户端连接对象: 从网络读写数据 数据编解码 将请求转发给上层组 ...
- NC51179 选课
题目链接 题目 题目描述 学校实行学分制. 每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分. 学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的. 学生选修了这 M 门课 ...
- Sentinel 源码学习
引入依赖 <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-co ...
- MVVM模式的理解
MVVM模式的理解 MVVM全称Model-View-ViewModel是基于MVC和MVP体系结构模式的改进,MVVM就是MVC模式中的View的状态和行为抽象化,将视图UI和业务逻辑分开,更清楚地 ...
- win32 - 监控DNS是否发生改变
两种方法: 第一种是使用WMI进行后台轮询 第二种是查询注册表对应的DNS键值 Here: HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameter ...
- KPTP 汇报模板
1.什么是KPTP 它是由4个单词:Keep.Problem.Try.Plan的首字母组成的. K:keep,今天做了哪些工作: P:problem,遇到了哪些问题: T:try,计划尝试如何解决这些 ...