copypasta

package
v0.0.0-...-8a7fe10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 23, 2024 License: MIT Imports: 3 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Abs

func Abs[T Number](x T) T

func BinarySearch

func BinarySearch[Number interface {
	~int | ~int64 | ~uint | ~uint64 | ~float64
}](left, right Number, check func(i Number) bool) Number

BinarySearch 在区间 [left, right) 中二分查找最小的 left, 满足 check(left) == true, 如果未能找到满足条件的 left, 那么将会返回 right 而不是 -1。

定义:check(left-1) == false and check(right) == true.

func KMP

func KMP(text, patten []rune) (pos []int)

KMP implement Knuth–Morris–Pratt algorithm search pattern from text, return all start positions

kmp 在求 前缀表 / next 数组时,借助了动态规划的思想; 在求模式串的索引位置时,则是贪心的思想。

[前缀函数与 kmp 算法 - OI Wiki](https://oi.wiki/string/kmp) [如何更好地理解和掌握 kmp 算法? - 阮行止的回答](https://www.zhihu.com/question/21923021/answer/1032665486)

func KMP2

func KMP2(text, patten []rune) (pos []int)

KMP2 前缀函数的运用

给定一个文本 t 和一个字符串 s,我们尝试找到并展示 s 在 t 中的所有出现(occurrence)。 为了简便起见,我们用 n 表示字符串 s 的长度,用 m 表示文本 t 的长度。 我们构造一个字符串 s+#+t,其中 # 为一个既不出现在 s 中也不出现在 t 中的分隔符。

接下来计算该字符串的前缀函数。 现在考虑该前缀函数除去最开始 n+1个值(即属于字符串s和分隔符的函数值)后其余函数值的意义。 根据定义,match[i] 为右端点在且同时为一个前缀的最长真子串的长度,具体到我们的这种情况下, 其值为与的前缀相同且右端点位于的最长子串的长度。由于分隔符的存在,该长度不可能超过 n。 而如果等式 match[i]= n 成立,则意味着 s 完整出现在该位置(即其右端点位于位置i)。

注意该位置的下标是对字符串 s+#+t而言的。 因此如果在某一位置有 match[i]=n 成立,则字符串 s在字符串t的 i - (n-1)-(n+1) = i - 2n处出现。

func MapKeys

func MapKeys[M ~map[K]V, K comparable, V any](m M) (keys []K)

func MaxPrefix

func MaxPrefix(str []rune) (match []int)

MaxPrefix 前缀表

match[i] 表示在子串 str[:i] 中「真前缀」和「真后缀」一致时的最大长度,「真前缀」/「后前缀」指不包含自身的 前缀/后缀。 或者说在子串 str[:i-1] 中求「前缀」和「后缀」一致时的最大长度

func MergeSort

func MergeSort[T cmp.Ordered](s []T, f func(left, right []T))

MergeSort 归并排序

归并排序基于分治思想将数组分段排序后合并,也是一种稳定排序的算法

闭包可用于统计逆序对。 归并填入后才会调用闭包,后续不会再使用入参切片,因此闭包内可以修改入参切片

模板题: LCR170. https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ LC493. https://leetcode.cn/problems/reverse-pairs/

简单变形: LC2426. https://leetcode.cn/problems/number-of-pairs-satisfying-inequality/

转换题:区间和 -> 前缀和之差 -> 逆序对: LC327. https://leetcode.cn/problems/count-of-range-sum/

func MergeSortWith

func MergeSortWith[T any](s []T, cmp func(x, y T) int, f func(left, right []T))

MergeSortWith 根据 cmp 函数作归并排序

归并排序基于分治思想将数组分段排序后合并,也是一种稳定排序的算法

闭包可用于逆序对的拓展题目。 归并填入后才会调用闭包,后续不会再使用入参切片,因此闭包内可以修改入参切片

带索引排序: LC315. https://leetcode.cn/problems/count-of-smaller-numbers-after-self

func Sum

func Sum[S ~[]E, E cmp.Ordered](x S) E

func ToPtr

func ToPtr[T any](v T) *T

func Unique

func Unique[T comparable](values []T) []T

Types

type Number

type Number interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL