【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 ...
随机推荐
- CH57x/CH58x/CH59x主从机主动发起断连
如果在做应用的时需要同时使用使用两块板子分别做主从机或者使用一块板子做单独的从机: 这是我们需要按下某个按键或者发送某条指令主机或者从机主动断开与对方的连接且设备不需要复位: 主机端我们可以调用这样一 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第11章)
第 11 章 开发实时应用和服务 在本章,我们将讨论"实时"的准确含义,以及在大部分消费者看来应该属于这一范畴的应用类型 接着,我们将探讨 WebSocket,并分析为什么传统的 ...
- thinkphp集成editormd一系列实战
介绍 最近php搞了个博客,需要集成markdown编辑器(富文本的太low了,效率也低),用的是时下比较火的editormd,除了基本的文档编辑我这里还实现了几个自己的需求: 使用ctrl-v实现将 ...
- 解决webservice接口调用报错:java.lang.ClassFormatError: Absent Code ... javax/mail/internet/MimeMultip
今天使用java axis调用.net发布的webservice接口报了个错,排查半天,感觉代码逻辑没问题,最后发现是jar包冲突!!! 调用接口相关代码: String url="http ...
- OpenAI 的视频生成大模型Sora的核心技术详解(一):Diffusion模型原理和代码详解
标题党一下,顺便蹭一下 OpenAI Sora大模型的热点,主要也是回顾一下扩散模型的原理. 1. 简单理解扩散模型 简单理解,扩散模型如下图所示可以分成两部分,一个是 forward,另一个是 re ...
- GDI快速遍历位图像素
使用DIB部分可直接快速访问像素 例如,此测试将记事本中的所有白色像素替换为绿色像素 HDC hDCScreen = GetDC(NULL); HWND hWndDest = FindWindow(L ...
- django从配置文件中读取数据库信息
创建配置文件my.cnf [client] database=django_db user=root password=123456 host=127.0.0.1 port=3306 settings ...
- del,str,repr,call,bool,add,len等魔术方法以及与类相关的魔术属性---day23
1.__del__ # ### __del__魔术方法(析构方法) ''' 触发时机:当对象被内存回收的时候自动触发(1.页面执行完毕回收所有变量2.所有对象被del的时候) 功能:对象使用完毕后资源 ...
- 在RecyclerView.Adapter中使用 ViewBinding 的一个注意点
使用 viewpager2 时遇到如下错误, 使用 recyclerview 也有可能会遇到 : 2022-02-10 14:15:43.510 12151-12151/com.sharpcj.dem ...
- 【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
问题描述 C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间? Redis维护说明: Redis 服务维护时,会把副本节点提升为主节点,且旧主节点关闭现有连接时,这个时候, ...