相关信息
es基础知识点学习(Elasticsearch)
如果数据库已经能
like '%关键词%'查询了,为什么还要 ES?
| elasticsearch | mysql |
|---|---|
| Index(索引) | database |
| Document(文档) | row(行) |
| Field(字段) | column(行) |
| Mapping | 表结构 |
| Shard(分片) | 数据拆分 |
| Replic(副本) | 数据备份 |
因为 Elasticsearch 采用 Near Real-Time 机制。
写入数据后不会立即生成倒排索引,而是先写入内存 buffer 和 translog。 只有在 refresh(默认1秒)时,才会生成 segment,使数据可搜索。
这样设计是为了减少频繁构建索引的开销,提高写入性能。
二叉搜索树删除节点实现
二叉搜索树(左子树比根节点小,右子树比根节点大) 里面查找并删除一个值和节点, 删除后保持搜索树结构,返回树的跟节点,假定树节点的值不重复
jstype TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func deleteNode(root *TreeNode, key int) *TreeNode {
if root == nil {
return nil
}
if key < root.Val {
root.Left = deleteNode(root.Left, key)
} else if key > root.Val {
root.Right = deleteNode(root.Right, key)
} else {
// 找到要删除的节点
if root.Left == nil {
return root.Right
}
if root.Right == nil {
return root.Left
}
// 左右子树都存在:找右子树最小节点
minNode := root.Right
for minNode.Left != nil {
minNode = minNode.Left
}
root.Val = minNode.Val
root.Right = deleteNode(root.Right, minNode.Val)
}
return root
}
每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73] 输出: [1,1,4,2,1,1,0,0] 示例 2:
输入: temperatures = [30,40,50,60] 输出: [1,1,1,0] 示例 3:
输入: temperatures = [30,60,90] 输出: [1,1,0]
jsfunc dailyTemperatures(temperatures []int) []int {
n := len(temperatures)
res := make([]int, n)
stack := []int{} // 存下标
for i := 0; i < n; i++ {
for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack)-1]] {
prev := stack[len(stack)-1]
stack = stack[:len(stack)-1]
res[prev] = i - prev
}
stack = append(stack, i)
}
return res
}
相关信息
本章节主要学习网络知识
相关信息
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
jspackage main
import (
"fmt"
)
// 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
// 最近公共祖先的定义:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,
// 满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
// 例如,如下二叉树: Integer[] levelOrder = {3,5,1,6,2,0,8,null,null,7,4};
// 3
// 5 1
// 6 2 0 8
// 7 4
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func main() {
// 构建二叉树
root := &TreeNode{Val: 3}
root.Left = &TreeNode{Val: 5}
root.Right = &TreeNode{Val: 1}
root.Left.Left = &TreeNode{Val: 6}
root.Left.Right = &TreeNode{Val: 2}
root.Right.Left = &TreeNode{Val: 0}
root.Right.Right = &TreeNode{Val: 8}
root.Left.Right.Left = &TreeNode{Val: 7}
root.Left.Right.Right = &TreeNode{Val: 4}
// 测试最近公共祖先
p := root.Left.Right.Left
q := root.Left.Right.Right
lca := lowestCommonAncestor(root, p, q)
fmt.Println("最近公共祖先:", lca.Val)
// fmt.Println("Hello world!")
}
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil || root == p || root == q {
return root
}
left := lowestCommonAncestor(root.Left, p, q)
right := lowestCommonAncestor(root.Right, p, q)
if left != nil && right != nil {
return root
}
if left != nil {
return left
}
return right
}
相关信息
接雨水,这道题最大的问题在于理解怎么才能接到雨水
接雨水其实就是看当前位置的左右是否存在格挡,存在格挡可以存雨水,能存放的最大容积为左右出现的格挡的最大高度
第一步 声明变量初始值 left right maxLeft Maxleft res
第二步 从左右两边开始对比: for left < right {}
第三步 if height[left] < height[right] 则处理左边,否则处理右边
第四步 处理左边 如果当前位置(left)大于等于 maxLeft 则更新maxLeft 否则说明左边的高度是超出当前位置的,可以进行容积增加: maxLeft - height[left]
右边的逻辑和左边一样,发现右边的格挡更高,则增加高度差,否则更新高度最大值(当前值比maxRight更大)
jsfunc trap(height []int) int {
left, right := 0, len(height)-1
leftMax, rightMax := 0, 0
res := 0
for left < right {
if height[left] < height[right] {
if height[left] >= leftMax {
leftMax = height[left]
} else {
res += leftMax - height[left]
}
left++
} else {
if height[right] >= rightMax {
rightMax = height[right]
} else {
res += rightMax - height[right]
}
right--
}
}
return res
}