Golang每日一练(leetDay0053)

news/2025/2/1 15:55:37/

目录

155. 最小栈 Min Stack  🌟🌟

156. 二叉树的上下翻转 Binary Tree Upside Down  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


155. 最小栈 Min Stack

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]输出:
[null,null,null,null,-3,null,0,-2]解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • -2^31 <= val <= 2^31 - 1
  • poptop 和 getMin 操作总是在 非空栈 上调用
  • pushpoptop, and getMin最多被调用 3 * 10^4 次

代码:

package mainimport "fmt"type MinStack struct {stack    []int // 数据栈minStack []int // 最小值栈,存储截至当前元素为止的最小值
}func Constructor() MinStack {return MinStack{}
}func (this *MinStack) Push(val int) {this.stack = append(this.stack, val)if len(this.minStack) == 0 || val <= this.minStack[len(this.minStack)-1] {this.minStack = append(this.minStack, val)}
}func (this *MinStack) Pop() {if len(this.stack) == 0 {return}// 若出栈元素是当前最小值,则将最小值栈中对应元素也出栈if this.Top() == this.GetMin() {this.minStack = this.minStack[:len(this.minStack)-1]}this.stack = this.stack[:len(this.stack)-1]
}func (this *MinStack) Top() int {if len(this.stack) == 0 {return 0}return this.stack[len(this.stack)-1]
}func (this *MinStack) GetMin() int {if len(this.minStack) == 0 {return 0}return this.minStack[len(this.minStack)-1]
}func main() {minStack := Constructor()minStack.Push(-2)minStack.Push(0)minStack.Push(-3)n1 := minStack.GetMin()minStack.Pop()n2 := minStack.Top()n3 := minStack.GetMin()fmt.Println(n1, n2, n3)
}

输出:

-3 0 -2


156. 二叉树的上下翻转 Binary Tree Upside Down

给定一个二叉树,满足所有右节点要么是叶子节点,要么没有左兄弟节点,将它上下颠倒并转化为一个树,原来的右节点变成了左叶子节点。返回新的根节点。

例如,给定 binary tree [1,2,3,4,5] 为:

    1/ \2   3/ \
4   5

返回上下颠倒后的树:

   4/ \5   2/ \3   1

代码:

package mainimport "fmt"const null = -1 << 31type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func upsideDownBinaryTree(root *TreeNode) *TreeNode {if root == nil || root.Left == nil && root.Right == nil {return root}newRoot := upsideDownBinaryTree(root.Left)root.Left.Left, root.Left.Right = root.Right, rootroot.Left, root.Right = nil, nilreturn newRoot
}func levelOrder(root *TreeNode) [][]int {var res [][]intdfs(root, 0, &res)return res
}func dfs(node *TreeNode, level int, res *[][]int) {if node == nil {return}if level == len(*res) {*res = append(*res, []int{})}(*res)[level] = append((*res)[level], node.Val)dfs(node.Left, level+1, res)dfs(node.Right, level+1, res)
}func buildTree(nums []int) *TreeNode {if len(nums) == 0 {return nil}root := &TreeNode{Val: nums[0]}Queue := []*TreeNode{root}idx := 1for 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
}func Array2DToString(array [][]int) string {if len(array) == 0 {return "[]"}arr2str := func(arr []int) string {res := "["for i, ar := range arr {res += fmt.Sprint(ar)if i != len(arr)-1 {res += ","}}return res + "]"}res := "["for i, arr := range array {res += arr2str(arr)if i != len(array)-1 {res += ","}}return res + "]"
}func main() {nums := []int{1, 2, 3, 4, 5}root := buildTree(nums)fmt.Println(Array2DToString(levelOrder(root)))root = upsideDownBinaryTree(root)fmt.Println(Array2DToString(levelOrder(root)))
}

输出:

[[1],[2,3],[4,5]]
[[4],[5,2],[3,1]]

迭代:

```Go
func upsideDownBinaryTree(root *TreeNode) *TreeNode {
    if root == nil {
        return root
    }
    var prev, next, tmp *TreeNode
    for root != nil {
        next = root.Left
        root.Left = tmp
        tmp = root.Right
        root.Right = prev
        prev = root
        root = next
    }
    return prev
}
```


🌟 每日一练刷题专栏 🌟

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

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

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

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

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

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


http://www.ppmy.cn/news/56585.html

相关文章

每天一道算法练习题--Day15 第一章 --算法专题 --- -----------二叉树的遍历

概述 二叉树作为一个基础的数据结构&#xff0c;遍历算法作为一个基础的算法&#xff0c;两者结合当然是经典的组合了。很多题目都会有 ta 的身影&#xff0c;有直接问二叉树的遍历的&#xff0c;有间接问的。比如要你找到树中满足条件的节点&#xff0c;就是间接考察树的遍历…

C++构造函数和析构函数(附示例代码)

一、构造函数和析构函数 构造函数和析构函数是面向对象编程中的重要概念&#xff0c;用于创建和销毁对象。 构造函数是一种特殊的函数&#xff0c;它在对象被创建时自动调用。它的作用是初始化对象的状态&#xff0c;例如设置成员变量的默认值、分配资源等操作。构造函数与类…

Day35集合2

集合 集合提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变。 集合类体系结构&#xff1a;collection 是单列集合&#xff08;List是内容可重复 set是内容不可重复&#xff09; Map是双列集合 在List中还有&#xff08;ArrayList LinkedList 等&…

HJ51 输出单向链表中倒数第k个结点

写在前面&#xff1a; 做题环境如下&#xff1a; 题目渠道&#xff1a;牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言&#xff1a;C 一、题目描述 描述 输入一个单向链表&#xff0c;输出该链表中倒数第k个结点&#xff0c;链表的倒数第1个结点为链表的尾指针…

Java 静态代理与动态代理全面讲解

一、代理模式的作用 Java中代理模式是一种常见的设计模式&#xff0c;代理模式可以在不改变原有代码的情况下增强类的功能。代理模式包括静态代理和动态代理两种形式&#xff0c;AOP的底层机制就是动态代理。 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理…

ChatGPT技术原理 第六章:对话生成技术

目录 6.1 任务定义 6.2 基于检索的方法 6.3 基于生成的方法 6.4 评价指标 6.1 任务定义 对话生成技术是指使用自然语言处理技术生成与人类语言相似的对话。在对话生成任务中&#xff0c;模型需要理解输入的语境、用户的意图和上下文信息&#xff0c;然后生成能够回答用户问题…

服务运营| Healthcare Management Science 近期文章精选

作者&#xff1a;李舒湉 王畅 &#xff08;一&#xff09; Screening for preclinical Alzheimer’s disease: Deriving optimal policies using a partially observable Markov model nen Dumlu Z, Sayın S, Grvit İ H. Screening for preclinical Alzheimer’s disease: …

5款非常好用的设计工具,推荐第一款在线设计工具

特别是在当今的UI设计领域&#xff0c;如果没有合适的UI设计工具&#xff0c;那么即使你的创作能力很强&#xff0c;工作也会有限&#xff0c;但许多软件需要会员使用&#xff0c;这不适合新设计师&#xff0c;所以有在线UI设计工具吗&#xff1f;关于这个问题&#xff0c;今天…