暴力:

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. 零基础入门Vue之窥探大法——计算与侦听

    前言 在 上一小节 我介绍了我学习vue入门 插值语法 的过程. 在本篇,我将记录我对vue的 计算属性和侦听器 的学习记录 注:本篇对于"侦听"和"监听"是一 ...

  2. 初步上手Git软件及GitHub平台:基本操作方法

      本文介绍Git软件与GitHub平台的基本内容.使用方法与应用场景等. 目录 1 初步介绍 2 使用方法 2.1 GitHub配置 2.2 Git配置 2.3 代码上传至GitHub 1 初步介绍 ...

  3. NC16655 [NOIP2005]过河

    题目链接 题目 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可 ...

  4. OAuth2 Authorization Server

    基于Spring Security 5 的 Authorization Server的写法 先看演示 pom.xml <?xml version="1.0" encoding ...

  5. DS12C887时钟模块, STC89和STC12的代码实现

    DS12C887是时钟芯片DS12C885集成了电池和晶振的版本. 如果拆掉DS12C887的外壳, 能看到里面就是DS12C885. 功能特性 能输出世纪.年.月.日.时.分.秒等时间信息 集成电池 ...

  6. oracle FGAC(细粒度访问控制)介绍

    在ORACLE中,RLS有时也叫做虚拟私有数据库(VPD)或者细粒度访问控制(FGAC). RLS由8i引进,利用这一特性我们可以对表定义安全策略(并且指明对表的操作类型),实现对用户可以看到或者修改 ...

  7. OpenAI 的视频生成大模型Sora的核心技术详解(一):Diffusion模型原理和代码详解

    标题党一下,顺便蹭一下 OpenAI Sora大模型的热点,主要也是回顾一下扩散模型的原理. 1. 简单理解扩散模型 简单理解,扩散模型如下图所示可以分成两部分,一个是 forward,另一个是 re ...

  8. 【Android逆向】破解看雪test3.apk方案二

    方案二就是要hook那三个条件,不让追加字符串变成false v20 = "REAL"; clazz = _JNIEnv::FindClass(env, "android ...

  9. Notepad++设置删除当前行快捷键

    Notepad++默认能实现"删除当前行"效果的快捷键是Ctrl + L,实际上这不并是真正意义上的删除当前行,而是剪切当前行. 而Eclipse中实现删除当前行的快捷键是:Ctr ...

  10. 细说Spring框架之核心01-概述

    官网:https://spring.io/projects/spring-framework 文档:https://docs.spring.io/spring-framework/docs/curre ...