首页 > 其他分享 >2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [starti, endi] 如果 pairs 的一个重新排列 满足对每一个下标 i

2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [starti, endi] 如果 pairs 的一个重新排列 满足对每一个下标 i

时间:2024-01-10 22:34:12浏览次数:38  
标签:pairs 下标 int graph record 重新排列 pair

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)
}

2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [starti, endi] 如果 pairs 的一个重新排列 满足对每一个下标 i_时间复杂度

标签:pairs,下标,int,graph,record,重新排列,pair
From: https://blog.51cto.com/moonfdd/9186644

相关文章

  • 2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示
    2024-01-03:用go语言,给你两个长度为n下标从0开始的整数数组cost和time,分别表示给n堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠,一位需要付费的油漆匠,刷第i堵墙需要花费time[i]单位的时间,开销为cost[i]单位的钱。一位免费的油漆匠,刷任意一堵墙的时间为1......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目,由于答......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目......
  • 【力扣】-28. 找出字符串中第一个匹配项的下标|刷题打卡-JS
    给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从0开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。......
  • Day39 数组基本特点及下标越界,小结
    数组基本特点及下标越界,小结数组的4个基本特点:1.其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2.其元素必须是相同类型,不允许出现混合类型。3.数组中的元素可以是任何数据类型,包括基本类型和引用类型。4.数组变量属引用类型,数组也可以看成是对象,数组中的每个元......
  • array 0维 1维 及以上 注意0维shape不可取下标
    importnumpyasnpimportpandasaspdforobjin['StrOrIntOr',[],['element'],[[]],[[],[]]]:arr=np.array(obj)df=pd.DataFrame([i,type(i)]foriin[obj,arr,arr.shape,len(arr.shape)])......
  • C. Removal of Unattractive Pairs
    这道题很考验思维。这道题目我们只需要考虑出现次数最多的字符的个数,分两种情况讨论。1、如果该字符出现次数超过n/2(这里设为x),那么其他字符和该字符凑成一对进行消除,即剩下的长度为2x-n。2、如果该字符出现次数低于n/2,那么对于任意字符都有足够的其余字符和他凑成一对进行消除,......
  • Python:列表的下标索引
    列表的下标(索引):取出特定位置的数据语法:列表[下标索引]列表的下标(索引)-反向反向索引就是从后向前:从-1开始,依次递减(-1、-2、-3...)嵌套列表的下标(索引)列表[内层列表[索引]]#通过下标索引取出对应位置的数据my_list=["itheima",666,True]#列表[下标索引],从前向后从......
  • 这就解释了tuple("单个多字符字符串") type==tuple, 其实是字符串被拆分到元组中, 以
    #单个多字符字符串拆分list("单个多字符字符串")tuple("单个多字符字符串")set("单个多字符字符串")#重新排序#dict不行ValueError:dictionaryupdatesequenceelement#0haslength1;2isrequiredlist("单个多字符字符串",)tuple("单个多字符字符串",)set("......
  • How to connect two pairs of AirPods to one phone simultaneously
    TechStreamingHomeKitchenHealthStyleBeautyGiftsDealsMore REVIEWS  TECHHowtoconnecttwopairsofAirPodstoonephonesimultaneouslyWrittenby AbigailAbesamisDemarest and DevonDelfino; editedby ElenaMatarazzo Updated......