2025-04-19:最长上升路径的长度。用go语言,给你一个长度为 n 的二维整数数组 coordinates 和一个整数 k(满足 0 <= k < n)。
数组 coordinates 中的每个元素 coordinates[i] = [xi, yi] 表示二维平面上的一个点 (xi, yi)。
定义一个点序列 (x1, y1), (x2, y2), ..., (xm, ym) 为“上升序列”,当且仅当满足:
1.对于序列中的每一对相邻点,坐标的 x 和 y 都严格递增,即对所有 1 <= i < m,有 xi < xi+1 且 yi < yi+1;
2.且序列中的每个点都存在于给定的 coordinates 数组中。
请你计算并返回一个包含点 coordinates[k] 的“最长上升序列”的长度。
1 <= n == coordinates.length <= 100000。
coordinates[i].length == 2。
0 <= coordinates[i][0], coordinates[i][1] <= 1000000000。
coordinates 中的元素 互不相同 。
0 <= k <= n - 1。
输入:coordinates = [[3,1],[2,2],[4,1],[0,0],[5,3]], k = 1。
输出:3。
解释:
(0, 0) ,(2, 2) ,(5, 3) 是包含坐标 (2, 2) 的最长上升路径。
题目来自leetcode3288。
coordinates[k]
的坐标 (kx, ky)
,这是必须包含在序列中的点。(kx, ky)
之前或之后的点,使得序列满足严格递增的条件。coordinates
数组进行排序。排序的规则是:coordinates
,筛选出满足以下条件的点:(kx, ky)
(可以放在 (kx, ky)
之前)。(kx, ky)
(可以放在 (kx, ky)
之后)。(kx, ky)
的上升序列的候选点。g
,其中 g[i]
表示长度为 i+1
的 LIS 的最小末尾元素。g
中的插入位置:g
的所有元素,则扩展 g
。g
中第一个大于或等于 y 的元素。g
的长度就是 LIS 的长度。(kx, ky)
本身也需要被计入序列)就是最终的最长上升序列的长度。O(n log n)
。O(n)
。O(m log m)
,其中 m
是筛选出的点的数量(m <= n
)。O(n log n)
(因为排序是主要操作)。O(n)
。g
数组:O(m)
(最坏情况下 m = n
)。O(n)
。package main
import (
"fmt"
"slices"
"sort"
"cmp"
)
func maxPathLength(coordinates [][]int, k int)int {
kx, ky := coordinates[k][0], coordinates[k][1]
slices.SortFunc(coordinates, func(a, b []int)int {
return cmp.Or(a[0]-b[0], b[1]-a[1])
})
g := []int{}
for _, p := range coordinates {
x, y := p[0], p[1]
if x < kx && y < ky || x > kx && y > ky {
j := sort.SearchInts(g, y)
if j < len(g) {
g[j] = y
} else {
g = append(g, y)
}
}
}
returnlen(g) + 1// 算上 coordinates[k]
}
func main() {
coordinates := [][]int{{3,1},{2,2},{4,1},{0,0},{5,3}}
k := 1
results := maxPathLength(coordinates, k)
fmt.Println(results)
}
# -*-coding:utf-8-*-
from bisect import bisect_left
defmax_path_length(coordinates, k):
kx, ky = coordinates[k]
# 按x升序,x相同按y降序排序
coordinates.sort(key=lambda p: (p[0], -p[1]))
g = []
for x, y in coordinates:
# 保留与k点同方向的点(x,y都比kx,ky大 或 都比kx,ky小)
if (x < kx and y < ky) or (x > kx and y > ky):
idx = bisect_left(g, y)
if idx < len(g):
g[idx] = y
else:
g.append(y)
# LIS长度+1,算上coordinates[k]
returnlen(g) + 1
if __name__ == "__main__":
coordinates = [[3,1],[2,2],[4,1],[0,0],[5,3]]
k = 1
result = max_path_length(coordinates, k)
print(result)
·