2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组

2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs

其中 pairs[i] = [starti, endi]

如果 pairs 的一个重新排列

满足对每一个下标 i ( 1 <= i < pairs.length )

都有 endi-1 == starti ,

那么我们就认为这个重新排列是 pairs 的一个 合法重新排列。

请你返回 任意一个 pairs 的合法重新排列。

注意:数据保证至少存在一个 pairs 的合法重新排列。

输入:pairs = [[5,1],[4,5],[11,9],[9,4]]。

输出:[[11,9],[9,4],[4,5],[5,1]]。

来自lc的2097题,合法重新排列数对。

答案2024-01-06:

来自左程云

灵捷3.5

大体步骤如下:

1.创建图和度数字典:遍历输入的pairs数组,通过创建一个空的图和一个空的度数字典。将pairs中的每个元素的起点和终点作为图的键,值初始化为空切片,同时将起点和终点作为度数字典的键,并将对应的值初始化为0。

2.构建图和计算度数:再次遍历pairs数组,将每个元素的起点作为图的键,在对应的值中添加终点,并将起点的度数加1。同时,将每个元素的终点作为图的键,在对应的值中添加起点,并将终点的度数减1。

3.确定起点:通过遍历度数字典,找到度数为1的点作为起点,将其保存在变量from中。

4.深度优先搜索:定义一个递归的深度优先搜索函数dfs,接收当前节点from、图和记录路径的二维切片record作为参数。在该函数中,首先获取from节点的相邻节点next,并将当前节点from添加到record中。然后遍历next中的每个节点to,调用dfs函数递归地搜索to节点,并将from和to形成的边添加到record中。

5.执行深度优先搜索:调用dfs函数,将起点from、图和空的record作为参数。

6.反转路径:根据record中的记录路径,将路径反转得到最终的合法重新排列。

7.返回结果:将反转后的路径作为结果返回。

总的时间复杂度为O(n),其中n为pairs数组的长度。构建图和计算度数的过程需要遍历两次pairs数组,时间复杂度为O(n)。深度优先搜索的时间复杂度为O(n),主要取决于图的节点数量。反转路径的过程需要遍历record数组,时间复杂度为O(n)。

总的额外空间复杂度为O(n),主要是用来存储图和路径记录的空间。

go完整代码如下:

package main

import (
    "fmt"
)

func validArrangement(pairs [][]int) [][]int {
    graph := make(map[int][]int)
    degrees := make(map[int]int)
    for _, pair := range pairs {
        graph[pair[0]] = []int{}
        graph[pair[1]] = []int{}
        degrees[pair[0]] = 0
        degrees[pair[1]] = 0
    }
    for _, pair := range pairs {
        graph[pair[0]] = append(graph[pair[0]], pair[1])
        degrees[pair[0]]++
        degrees[pair[1]]--
    }
    from := pairs[0][0]
    for cur, degree := range degrees {
        if degree == 1 {
            from = cur
            break
        }
    }
    record := [][]int{}
    dfs(from, graph, &record)
    n := len(record)
    ans := make([][]int, n)
    for i, j := n-1, 0; j < n; i, j = i-1, j+1 {
        ans[i] = record[j]
    }
    return ans
}

func dfs(from int, graph map[int][]int, record *[][]int) {
    next := graph[from]
    for len(next) > 0 {
        to := next[0]
        next = next[1:]
        dfs(to, graph, record)
        *record = append(*record, []int{from, to})
    }
}

func main() {
    pairs := [][]int{{5, 1}, {4, 5}, {11, 9}, {9, 4}}
    result := validArrangement(pairs)
    fmt.Println(result)
}

在这里插入图片描述

本作品采用《CC 协议》,转载必须注明作者和本文链接
微信公众号:福大大架构师每日一题。最新面试题,涉及golang,rust,mysql,redis,云原生,算法,分布式,网络,操作系统。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
472
粉丝
21
喜欢
37
收藏
22
排名:457
访问:1.9 万
私信
所有博文
社区赞助商