Golang每日一练(leetDay0062) BST迭代器、地下城游戏

目录

173. 二叉搜索树迭代器 Binary Search Tree Iterator  🌟🌟

174. 地下城游戏 Dungeon Game  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


173. 二叉搜索树迭代器 Binary Search Tree Iterator

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:

  • BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
  • boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
  • int next()将指针向右移动,然后返回指针处的数字。

注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。

你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。

示例:

输入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[null, 3, 7, true, 9, true, 15, true, 20, false]

解释
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next();    // 返回 3
bSTIterator.next();    // 返回 7
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 9
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 15
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 20
bSTIterator.hasNext(); // 返回 False

提示:

  • 树中节点的数目在范围 [1, 10^5] 内
  • 0 <= Node.val <= 10^6
  • 最多调用 10^5 次 hasNext 和 next 操作

进阶:

  • 你可以设计一个满足下述条件的解决方案吗?next() 和 hasNext() 操作均摊时间复杂度为 O(1) ,并使用 O(h) 内存。其中 h 是树的高度。

代码:

package main

import "fmt"

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

type BSTIterator struct {
	stack []*TreeNode
}

func Constructor(root *TreeNode) BSTIterator {
	stack := []*TreeNode{}
	node := root
	for node != nil {
		stack = append(stack, node)
		node = node.Left
	}
	return BSTIterator{stack}
}

func (it *BSTIterator) next() int {
	node := it.stack[len(it.stack)-1]
	it.stack = it.stack[:len(it.stack)-1]
	if node.Right != nil {
		n := node.Right
		for n != nil {
			it.stack = append(it.stack, n)
			n = n.Left
		}
	}
	return node.Val
}

func (it *BSTIterator) hasNext() bool {
	return len(it.stack) > 0
}

func main() {
	nums := []int{7, 3, 15, null, null, 9, 20}
	root := buildTree(nums)
	bSTIterator := Constructor(root)
	fmt.Println(bSTIterator.next())    // 返回 3
	fmt.Println(bSTIterator.next())    // 返回 7
	fmt.Println(bSTIterator.hasNext()) // 返回 True
	fmt.Println(bSTIterator.next())    // 返回 9
	fmt.Println(bSTIterator.hasNext()) // 返回 True
	fmt.Println(bSTIterator.next())    // 返回 15
	fmt.Println(bSTIterator.hasNext()) // 返回 True
	fmt.Println(bSTIterator.next())    // 返回 20
	fmt.Println(bSTIterator.hasNext()) // 返回 False
}

输出:

3
7
true
9
true
15
true
20
false


174. 地下城游戏 Dungeon Game

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7

-2 (K)-33
-5-101
1030-5 (P)

说明:

  • 骑士的健康点数没有上限。

  • 任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

代码1: 动态规划

func calculateMinimumHP(dungeon [][]int) int {
    m, n := len(dungeon), len(dungeon[0])
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    dp[m-1][n-1] = max(1-dungeon[m-1][n-1], 1) // 初始化右下角的值
    for i := m-2; i >= 0; i-- { // 递推最后一列的值
        dp[i][n-1] = max(dp[i+1][n-1]-dungeon[i][n-1], 1)
    }
    for j := n-2; j >= 0; j-- { // 递推最后一行的值
        dp[m-1][j] = max(dp[m-1][j+1]-dungeon[m-1][j], 1)
    }
    for i := m-2; i >= 0; i-- {
        for j := n-2; j >= 0; j-- {
            dp[i][j] = max(min(dp[i+1][j], dp[i][j+1])-dungeon[i][j], 1)
        }
    }
    return dp[0][0]
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

代码2: 二分查找

func calculateMinimumHP(dungeon [][]int) int {
    m, n := len(dungeon), len(dungeon[0])
    left, right := 1, 1000000
    for left < right {
        mid := left + (right-left)/2
        if canSave(mid, dungeon, m, n) {
            right = mid
        } else {
            left = mid+1
        }
    }
    return left
}

func canSave(x int, dungeon [][]int, m, n int) bool {
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    dp[0][0] = x + dungeon[0][0]
    if dp[0][0] <= 0 {
        return false
    }
    for i := 1; i < n; i++ { // 处理第一行
        dp[0][i] = dp[0][i-1] + dungeon[0][i]
        if dp[0][i] <= 0 {
            return false
        }
    }
    for i := 1; i < m; i++ { // 处理第一列
        dp[i][0] = dp[i-1][0] + dungeon[i][0]
        if dp[i][0] <= 0 {
            return false
        }
    }
    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + dungeon[i][j]
            if dp[i][j] <= 0 {
                return false
            }
        }
    }
    return true
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/19317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASEMI代理LT8609AJDDM#WTRPBF原装ADI车规级芯片

编辑&#xff1a;ll ASEMI代理LT8609AJDDM#WTRPBF原装ADI车规级芯片 型号&#xff1a;LT8609AJDDM#WTRPBF 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;DFN-10 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;10 工作温度:-40C~125C 类型…

python基础语法

一、配置python环境 &#xff08;1&#xff09;设置环境变量 path添加 C:\Program Files\Python3_11 C:\Program Files\Python3_11\Scripts &#xff08;2&#xff09;了解pip 什么是pip&#xff1f; pip是pyton包管理器&#xff0c;pypi&#xff08;Python Package Ind…

前端开发之Echarts 图表渐变两种实现方式和动态改变图表类型

前端开发之Echarts 图表渐变两种实现方式 前言效果图一、echarts中存在两种渐变方式1、color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{}&#xff0c;{}&#xff0c;{}])简单案例 2、{type: linear,x: 0,y: 0,x2: 0,y2: 1, [{}&#xff0c;{}&#xff0c;{}]}案例 二…

Codeforces Round 872 (Div. 2)

Problem - D2 - Codeforces 思路&#xff1a; 我们设good点到所有k点的距离和为dis。 假设good点不止一个&#xff0c;那么我们good点的dis应该都是相等的&#xff08;废话&#xff09;。设当前点u是good点&#xff0c;如果他往儿子v移动&#xff0c;儿子有w个点属于k&#…

怎么把mkv格式改成mp4?不妨试试这几种方法吧!

怎么把mkv格式改成mp4&#xff1f;mp4是一种多媒体封装格式&#xff0c;不过我们通常会将它说成是视频格式&#xff0c;它可以在一个文件中容纳无限数量的视频、音频、图片或字幕轨道&#xff0c;mp4格式也是被我们每个人所熟知&#xff0c;因为我们每个人几乎每天都会接触或者…

美团太细了,HashMap可以存null,ConcurrentHashMap不可以,为什么?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 420 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; 我们知道&#xff0c;ConcurrentHashMap在使用时&#xff0c;和HashMap有一个比较大的区别&#xff0c;那就是HashM…

springboot 多模块项目

比起传统复杂的单体工程&#xff0c;使用Maven的多模块配置&#xff0c;可以帮助项目划分模块&#xff0c;鼓励重用&#xff0c;防止POM变得过于庞大&#xff0c;方便某个模块的构建&#xff0c;而不用每次都构建整个项目&#xff0c;并且使得针对某个模块的特殊控制更为方便。…

Java系统环境变量配置

PATH环境变量 PATH环境变量用于保存一系列命令&#xff08;可执行程序&#xff09;的路径&#xff0c;每个路径之间以分号分隔。当在命令行窗口运行一个命令时&#xff0c;操作系统首先会在当前目录下查找是否存在该命令对应的可执行文件&#xff0c;如果未找到&#xff0c;操作…

模糊PID(重心法解模糊梯形图FC)

模糊PID的模糊化请参看下面的博客文章: 博途PLC模糊PID三角隶属度函数指令(含Matlab仿真)_plc 模糊pid_RXXW_Dor的博客-CSDN博客三角隶属度函数FC,我们采用兼容C99标准的函数返回值写法,在FB里调用会更加直观,下面给大家具体讲解代码。常规写法的隶属度函数FC可以参看下…

使用auto-gpt来写一篇技术文章(如何部署autogpt+遇到的问题+如何使用)

文章目录 前言一、autogpt本地部署1.clone代码2.启动虚拟环境3.运行项目 二、使用aotogpt生成文章1.人设描述2.设置目标3.文章的生成过程4.文章的生成内容 总结 前言 最近AI技术的发展非常迅猛&#xff0c;尤其是和GPT相关的技术&#xff0c;备受瞩目。近日&#xff0c;Autogp…

IPv6有哪些优势?

现有的互联网是在IPv4协议的基础上运行的。IPv6是下一版本的互联网协议&#xff0c;也可以说是下一代互联网的协议&#xff0c;它的提出最初是因为随着互联网的迅速发展&#xff0c;IPv4定义的有限地址空间将被耗尽&#xff0c;而地址空间的不足必将妨碍互联网的进一步发展。 为…

视频创作教程-蜜蜂剪辑软件

视频创作教程-蜜蜂剪辑软件 作者介绍 一、视频剪辑软件二、蜜蜂剪辑软件使用1.视频比例选择2.添加视频素材3.视频分割4.添加文字5.转场滤镜6.其它 三、创作实例四、软件分享 作者介绍 熊文博&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&…

Vue3 基础语法

文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive&#xff08;对象类型&#xff09;2.4 ref&#xff08;简单类型&#xff09;2.5 computed(计算属性)2.6 watch&#xff08;监听&#xff09; 3.vue3 生命周期4.vue3 组件通信4.…

RabbitMQ (HelloWord 消息应答 持久化 不公平分发 预取值)

文章目录 HelloWord工作队列工作线程代码启动两个工作线程工作队列&#xff08;生产者代码&#xff09;工作队列&#xff08;结果成功&#xff09; 消息应答自动应答手动消息应答multiple的解释消息自动重新入队手动应答代码消息手动应答&#xff08;生产者&#xff09;消息手动…

分布式系统概念和设计——命名服务设计和落地经验

分布式系统概念和设计 通过命名服务&#xff0c;客户进程可以根据名字获取资源或对象的地址等属性。 被命名的实体可以是多种类型&#xff0c;并且可由不同的服务管理。 命名服务 命名是一个分布式系统中的非常基础的问题&#xff0c;名字在分布式系统中代表了广泛的资源&#…

企业官方网站怎么申请?

在数字化时代&#xff0c;企业官方网站是展示企业形象、宣传产品和服务的重要窗口。那么&#xff0c;企业官方网站怎么申请呢&#xff1f;下面是一些简单的步骤。 1、选择合适的网站建设平台 目前市面上有许多网站建设平台&#xff0c;企业需要根据自己的需求和预算选择适合自…

公司新来个卷王,让人崩溃...

最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件测试技术栈&#xff0c;非常珍贵&#x…

电力系统储能调峰、调频模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

算法修炼之练气篇——练气二十一层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

程序员面试金典16.*

文章目录 16.01 交换数字16.02单词频率16.03交点16.04 井字游戏16.05 阶乘尾数16.06 最小差16.07 最大数值16.08 整数的英文表示16.09 运算16.10 生存人数16.11 跳水板16.13 平分正方形16.14 最佳直线&#xff08;待定&#xff09;16.15珠玑妙算16.16部分排序16.17连续数列16.1…