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

news2024/11/29 3:41:00

目录

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.coloradmin.cn/o/512596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全景丨0基础学习VR全景制作,平台篇第21章:热点功能-电话

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 电话热点&#xff0c;即手机端点击热点后可…

sentinel参数配置详细说明

使用的是sentinel-dashboard来配置 流控规则 阈值类型 QPS 当每秒并发数大于配置&#xff0c;则进行限流并发数线程数 当执行的线程数大于配置&#xff0c;则进行限流 单机阈值 配置的具体值 流控模式 直接 默认项&#xff0c;就是在资源名配置的路径进行生效 关联&#…

量子启发生成AI!Zapata Computing联合宝马、MIT优化车辆生产

​ &#xff08;图片来源&#xff1a;网络&#xff09; Zapata Computing是一家量子软件开发公司&#xff0c;致力于为企业构建量子就绪应用解决方案&#xff0c;以解决最复杂的计算问题。5月4日&#xff0c;Zapata Computing宣布发表一篇论文&#xff0c;详细介绍了他们联合宝…

Nevron Open Vision for .NET 2022.3 Crack

Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件&#xff0c;可帮助您从单个代码库开发功能丰富的 Web &#xff08;Blazor WebAssembly&#xff09; 和桌面 &#xff08;WinFor…

C++ MFC调用JS代码获取返回值

C有时候会需要调用JS代码&#xff0c;这对于C来说或者对于国内来说一直是比较蛋疼的问题&#xff0c;主要是资料少&#xff0c;微软提供了一个COM组件&#xff0c;里面包含有JS引擎&#xff0c;这个组件就是&#xff1a;msscript.dll。 此文件在C:\Windows\SysWOW64目录下&…

【TA100】6 PC手机图形API介绍

1 电脑的工作原理: 电脑是由各种不同的硬件组成&#xff0c;由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。定义:是一个图形库&#xff0c;用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口 (API)。针对GPU。应用端:即我们自己的程序端…

MySql -- JDBC编程

1.Java的数据库编程&#xff1a;JDBC JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成&#xff0c;它为Java开…

Flutter性能分析工具使用

使用前提 flutter常用的性能分析工具&#xff0c;这些工具都集成在android studio中&#xff0c;基本能满足我们的需求了。在下面介绍的几个工具中&#xff0c;Flutter Performance和Flutter Inspector都能够直接在debug模式下使用&#xff0c;但是DevTools只能在profile模式下…

铁路中的警冲标

1、警冲标的定义 警冲标是用来指示机车车辆停车时&#xff0c;不准向道岔方向或线路交叉点方向越过&#xff0c;以防止停留在该线上的机车车辆与邻线上的机车车辆发生侧面冲突的标志。另外&#xff0c;在出站道岔上&#xff0c;警冲标用来确定站界标位置。 2、警冲标怎么设置 …

nettyspringboot开发即时通讯系统

Netty 和 Spring Boot 是当今应用最广泛的 Java 技术之一&#xff0c;两个框架的集成能够构建出高效、稳定并且易于扩展的即时通讯系统。在本篇文章中&#xff0c;我们将会学习和探讨 Netty 和 Spring Boot 的整合&#xff0c;并且演示如何使用它们来构建一个高效、实时的即时通…

浓缩咖啡会降低2型糖尿病风险?

咖啡是全球消费最频繁的饮料之一&#xff0c;其潜在的健康效应引发了重要的科学研究。先前的研究已经将更高的咖啡摄入量与较低的T2D风险联系起来&#xff0c;但潜在机制仍不清楚。 一项新研究揭示&#xff0c;咖啡有助于降低2型糖尿病的风险。研究人员发现&#xff0c;每天增加…

安装endnote 之后打开word出现乱码

文章目录 1 安装endnote 之后打开word出现乱码3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程&#xff08;毕业论文参考文献管理器&#xff09; 1 安装endnote 之后打开word出现乱码 安装了endnote&#xff0c;打开文档后&#xff0c;目录显示这样&#xff…

虹科案例 | 对症下药,零售行业商业智能分析解决方案及应用案例!

零售行业商业智能分析解决方案 Domo为零售、电子商务、物联网等提供数据洞察力 利用数字增强数字程序的应用 -快速迭代并指导数字化程序的应用。 -有效管理“最后一公里”并降低交付成本。 -优化客户体验并不断适应客户的新需求&#xff0c;例如线下实体店可进行在线退货。…

【Hackthebox Stocker】打靶记录

Hackthebox Stocker nmap 扫描一把 得到tcp端口22 80 nmap -sC -sV 10.10.11.196 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-10 05:51 EDT Nmap scan report for 10.10.11.196 Host is up (0.25s latency). Not shown: 998 closed tcp ports (reset) PORT STAT…

C++:C++Primer Plus(第六版):Chapter16 : string类和标准模板库:智能指针

Chapter16.2 : 智能指针模板类 1.指针指针现实需求1.1 普通指针弊端 1.2 智能指针现实需求2. 智能指针使用范式2.1 下面演绎三种智能指针用法注意一个问题 3. 三种智能指针特点3.1 为何摒弃 auto_ptr 3.2 选用 unique_ptr3.3 选用 shared_ptr4. 应该使用哪种智能指针 本章节我们…

学好数据结构的秘诀

学好数据结构的秘诀 作为计算机专业的一名“老兵”&#xff0c;笔者从事数据结构和算法的研究已经近20余年了&#xff0c;在学习的过程中&#xff0c;也会遇到一些问题&#xff0c;但在解决问题时&#xff0c;积累了一些经验&#xff0c;为了让读者在学习数据结构的过程中少走…

Vue2全家桶 (Vue2、VueRouter、Vuex) 笔记

前言 有错的地方希望大家能够帮忙指正一下&#xff1b;本文只是对Vue2全家桶的基本语法进行记录。给孩子点点关注吧&#xff01;&#x1f62d; 壹、Vue2 Vue&#xff1a;一个 JavaScript 渐进式框架&#xff1b; 渐进式&#xff1a;逐渐使用&#xff0c;集合更多的功能&am…

一文总结 Google I/O 2023

今日凌晨举行的谷歌 I / O 2023 开发者大会上&#xff0c;如果说和往年有什么不同&#xff0c;那么应该就是更大力度的 All in AI 。 毕竟在去年 I/O 宣布重点投入 AI 之后&#xff0c;年末却被 OpenAI 的 ChatGPT “越塔偷家”&#xff0c;匆忙攒出一个发布会还让 Bard 爆出事…

国内最大规模上云实践 | 鹅厂如何在云原生2.0时代“挖呀挖”?

&#x1f449;腾小云导读 2022 年 10 月&#xff0c;腾讯自研业务产品全面完成云原生上云。自研业务产品云上规模已突破 5000w CPU&#xff0c;借助云原生的技术优势&#xff0c;全面提升了腾讯自研业务产品的运营效率&#xff0c;在此过程中我们也对腾讯云产品进行了打磨和验证…

适合Python 初学者入门教程和资源

如果您是 Python 的初学者&#xff0c;以下是一些入门教程和资源可以帮助您快速开始&#xff1a; 1、Python 官方教程: Python 官方网站提供了完整的入门教程&#xff0c;包括语言基础、面向对象编程、模块、文件处理等方面的内容。这是一个非常全面和权威的资源。 2、Codecade…