暴力:

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. require 与 import

    common.js 模块化规范   app.js 文件: // require 在代码执行阶段才会调用引入文件,编译(预解析)时不会执行,所以下面会报错 // console.log(dep); Re ...

  2. Redis Desktop Manager 0.9.3.817 最后一版免费版,新版要收费

    链接: https://pan.baidu.com/s/1wyELUhOn_rumFecNAS7L0A      提取码: 1631 版本是两三个月前,我从官网下载的,然后顺便存到了我的移动硬盘上.0 ...

  3. HBase-Hbase启动异常java.lang.IllegalArgumentException: object is not an instance of declaring class

    1.问题描述 HBase启动时异常如下: java.lang.IllegalArgumentException: object is not an instance of declaring clas ...

  4. 使用OBS Studio软件进行桌面录屏

    操作系统 :Windows10_x64 OBS Studio是开源免费的录屏和直播软件,支持Windows.macOS及Linux操作系统. 这里记录下桌面录屏和桌面区域录屏的使用,也方便我后续查阅( ...

  5. NC19857 最后的晚餐(dinner)

    题目链接 题目 题目描述 ​ **YZ(已被和谐)的食堂实在是太挤辣!所以Apojacsleam现在想邀请他的一些好友去校外吃一顿饭,并在某酒店包下了一桌饭. ​ 当Apojacsleam和他的同学们 ...

  6. Wireguard笔记(二) 命令行操作

    目录 Wireguard笔记(一) 节点安装配置和参数说明 Wireguard笔记(二) 命令行操作 Wireguard笔记(三) lan-to-lan子网穿透和多网段并存 命令行操作 创建wg0网卡 ...

  7. 【framework】TaskStack简介

    1 前言 ​ TaskStack 用于管理 app,一般一个应用程序对应一个 TaskStack,其父容器为 TaskStackContainers(DisplayContent 的子容器),子容器为 ...

  8. win32--GetFileAttributes

    DWORD d = GetFileAttributes(path.c_str()); 根据返回的十进制,对比文件属性,来检索指定文件或目录的文件系统属性. 也可以使用 if ((d & FIL ...

  9. 正则函数及面向对象开发初识---day19

    1.正则函数 # ### 正则函数 import re #search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "1+2 3*4" obj = ...

  10. linux7/8版本的docker-ce安装(2022/5/27亲测可行)

    centos7 # 先配阿里源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup curl - ...