暴力:

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题 二叉搜索树染色】广度搜索的更多相关文章

  1. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  2. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  3. LeetCode 95 | 构造出所有二叉搜索树

    今天是LeetCode专题第61篇文章,我们一起来看的是LeetCode95题,Unique Binary Search Trees II(不同的二叉搜索树II). 这道题的官方难度是Medium,点 ...

  4. C# leetcode 之 096 不同的二叉搜索树

    C# leetcode 之 096 不同的二叉搜索树 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 二叉搜索树定义 左子树上所有节点的值小于根节点, 右子树上左右 ...

  5. Leetcode:96. 不同的二叉搜索树

    Leetcode:96. 不同的二叉搜索树 Leetcode:96. 不同的二叉搜索树 题目在链接中,点进去看看吧! 先介绍一个名词:卡特兰数 卡特兰数 卡特兰数Cn满足以下递推关系: \[ C_{n ...

  6. C#LeetCode刷题-二叉搜索树

    二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III   19.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 327 区间和的个数   29.5% 困难 3 ...

  7. 【leetcode 简单】 第六十八题 二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...

  8. [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  9. [LeetCode] 109. 有序链表转换二叉搜索树

    题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...

  10. [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

随机推荐

  1. 小知识:OGG的TRANLOGOPTIONS MINEFROMACTIVEDG参数

    最近客户有一个需求,OGG源端需要配置在ADG环境,按历史配置规范,开启抽取进程报错: 2020-08-26 18:02:27 ERROR OGG-00060 Extract requires a v ...

  2. 如何修改OSW图表中显示的主机名称

    本次测试的OSW版本:831 有人可能会说这种需求是吃饱了撑的吗,谁没事儿改这个名称干嘛啊? 其实并不是,因为有些生产案例非常典型,分享讲解时也需要配合OSW的趋势图来展示,但是出于保护客户隐私(哪怕 ...

  3. 使用 BrowserView 的注意事项!!

    请看gif:

  4. RDS for MySQL并发性能测试

    最近由于工作需要,需要对阿里云数据库-RDS for MySQL进行性能测试,通过MySQL自带的mysqlslap工具可以进行并发性能测试,但是输出显示总感觉有问题,所以就萌生想法自己开发代码通过J ...

  5. Linux中单引号和双引号的区别

    区别:单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用:而双引号属于弱引用,它会对一些被引起来的字符进行特殊处理.简单来说,单引号直接输出内部字符串,不解析特 ...

  6. CentOS7环境源码安装freeswitch1.10.7

    操作系统 :CentOS 7.6_x64 freeswitch版本 :1.10.7 一.安装步骤 1.下载freeswitch源代码 wget http://files.freeswitch.org/ ...

  7. layui弹出层:使用icon图标小结

    转自:https://www.cnblogs.com/webSnow/p/15470350.html layui弹出层:使用icon图标小结 Layui 踩坑篇layui的弹框插件layer中,有很多 ...

  8. Java图片加水印

    采用Java自带的Image IO 废话不多说,上菜 1.  文字水印 1 import sun.font.FontDesignMetrics; 2 3 import javax.imageio.Im ...

  9. 【Unity3D】动画回调函数、动画事件、动画曲线

    1 动画回调函数 ​ 动画回调函数是指动画在开始时.执行中.结束时回调的函数,主要有:OnStateEnter.OnStateUpdate.OnStateExit.OnStateMove.OnStat ...

  10. 将字符串"a,b,c"以逗号分隔转换为数组并打印

    主要利用了String的split方法. package com.dylan.test; /** * @author xusucheng * @create 2017-12-22 **/ public ...