【每日力扣】 修剪二叉搜索树与复原 IP 地址

2024-03-19 19:12

本文主要是介绍【每日力扣】 修剪二叉搜索树与复原 IP 地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。

669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

image-20240318103130121

解决思路

  1. 如果当前节点为空,则直接返回空节点。
  2. 如果当前节点值小于最小边界,则修剪掉当前节点的左子树,并递归处理右子树。
  3. 如果当前节点值大于最大边界,则修剪掉当前节点的右子树,并递归处理左子树。
  4. 如果当前节点值在范围内,则修剪左右子树,并保持当前节点不变。

代码

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}
}public class TrimBST {public TreeNode trimBST(TreeNode root, int low, int high) {if (root == null) {return null;}if (root.val < low) {// 如果根节点值小于最小边界,则修剪掉左子树,并递归处理右子树return trimBST(root.right, low, high);} else if (root.val > high) {// 如果根节点值大于最大边界,则修剪掉右子树,并递归处理左子树return trimBST(root.left, low, high);} else {// 根节点值在边界内,则修剪左右子树,并保持根节点不变root.left = trimBST(root.left, low, high);root.right = trimBST(root.right, low, high);return root;}}public static void main(String[] args) {TreeNode root = new TreeNode(3);root.left = new TreeNode(0);root.right = new TreeNode(4);root.left.right = new TreeNode(2);root.left.right.left = new TreeNode(1);int low = 1;int high = 3;TrimBST solution = new TrimBST();TreeNode result = solution.trimBST(root, low, high);// 输出结果System.out.println(result);}
}

复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

image-20240318105552056

解决思路

对于这个问题,我们可以使用回溯算法来生成所有可能的 IP 地址。具体步骤如下:

  1. 创建一个结果列表,用于存储所有有效的 IP 地址。
  2. 开始回溯搜索,遍历可能的 IP 地址格式。
  3. 在每一步中,判断当前的子串是否是合法的 IP 地址段(在 0 到 255 之间,且不能含有前导 0)。
  4. 如果满足条件,则继续递归搜索下一段 IP 地址。
  5. 如果四段 IP 地址都满足条件,并且已经遍历完整个字符串 s,则将当前的 IP 地址添加到结果列表中。

代码

import java.util.ArrayList;
import java.util.List;public class RestoreIPAddress {public List<String> restoreIpAddresses(String s) {List<String> result = new ArrayList<>();backtrack(s, 0, new ArrayList<>(), result);return result;}private void backtrack(String s, int start, List<String> path, List<String> result) {if (path.size() == 4 && start == s.length()) {result.add(String.join(".", path));return;}for (int i = 1; i <= 3; i++) {if (start + i > s.length()) {break;}String segment = s.substring(start, start + i);if (isValid(segment)) {path.add(segment);backtrack(s, start + i, path, result);path.remove(path.size() - 1);}}}private boolean isValid(String segment) {if (segment.length() > 1 && segment.charAt(0) == '0') {return false; // 不允许前导 0}int num = Integer.parseInt(segment);return num >= 0 && num <= 255;}public static void main(String[] args) {String s = "25525511135";RestoreIPAddress solution = new RestoreIPAddress();List<String> result = solution.restoreIpAddresses(s);System.out.println(result); // 输出 ["255.255.11.135","255.255.111.35"]}
}

在这里插入图片描述

这篇关于【每日力扣】 修剪二叉搜索树与复原 IP 地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826988

相关文章

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close