Golang每日一练(leetDay0053) 最小栈、二叉树的上下翻转

简介: Golang每日一练(leetDay0053) 最小栈、二叉树的上下翻转

155. 最小栈 Min Stack

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

实现 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
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 10^4

代码:

package main
import "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 main
import "fmt"
const null = -1 << 31
type TreeNode struct {
  Val   int
  Left  *TreeNode
  Right *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, root
  root.Left, root.Right = nil, nil
  return newRoot
}
func levelOrder(root *TreeNode) [][]int {
  var res [][]int
  dfs(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 := 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
}
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/


目录
相关文章
|
22天前
|
存储 算法 数据库
使用python hashlib模块给明文字符串加密,以及如何撞库破解密码
`hashlib` 是 Python 中用于实现哈希功能的模块,它可以将任意长度的输入通过哈希算法转换为固定长度的输出,即散列值。该模块主要用于字符串加密,例如将用户名和密码转换为不可逆的散列值存储,从而提高安全性。`hashlib` 提供了多种哈希算法,如 `md5`、`sha1`、`sha256` 等。
34 1
|
30天前
|
存储 索引 Python
四:《Python基础语法汇总》— 字符串操作
本篇文章详细讲述了关于如何获取字符串中元素的操作(为了方便大家理解,着重讲述了下标索引与切片),及字符串的常用方法与函数和字符串的运算
15 2
四:《Python基础语法汇总》— 字符串操作
|
22天前
|
Python
python字符串常用操作方法
python字符串常用操作方法
|
23天前
|
数据采集 Python
|
1月前
|
SQL JSON C语言
Python中字符串的三种定义方法
Python中字符串的三种定义方法
|
1月前
|
索引 Python
Python学习笔记----操作字符串
这篇文章是一份Python字符串操作的学习笔记,涵盖了字符串相加、序列相加、字符串长度和字符的查找、统计、分割、连接、替换、去除空白、大小写转换以及判断字符串是否由字母和数字组成等常用方法。
Python学习笔记----操作字符串
|
1月前
|
Python
2:Python字符串与数字
这段代码示例展示了Python中的字符串定义、字符串操作(如连接和重复)、基本算术运算以及条件判断。字符串可通过单双引号定义。字符串支持加法(连接)与乘法(重复)。数字变量支持加减乘除等运算。示例还对比了两个条件语句代码块:第一个因使用全角冒号及未闭合字符串引发语法错误;第二个则正确无误,当条件为真时将输出&quot;我是神仙&quot;和&quot;我是高手&quot;。这强调了遵循Python语法规范的重要性。
|
19天前
|
UED Python
探索Python中的魔法方法:打造自定义字符串表示
【8月更文挑战第31天】在Python的世界里,魔法方法是那些以双下划线开头和结尾的特殊方法,它们为类提供了丰富的功能。本文将带你走进这些魔法方法的背后,特别是__str__和__repr__,揭示如何通过它们来定制我们的对象在被打印或转换为字符串时的外观。我们将从基础用法开始,逐步深入到高级技巧,包括继承与重写,最终实现一个优雅的字符串表示方案。准备好了吗?让我们开始这段代码之旅吧!
|
21天前
|
存储 Python
Python 中的名称空间是什么?
【8月更文挑战第29天】
10 0
|
21天前
|
索引 Python
如何在 Python 中修改字符串
【8月更文挑战第29天】
13 0