2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =
2023-09-03:用go语言编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1
给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,
其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。
再给你一个长度为 n 的数组 coins ,其中 coins[i] 可能为 0 也可能为 1 ,
1 表示节点 i 处有一个金币。
一开始,你需要选择树中任意一个节点出发。你可以执行下述操作任意次:
收集距离当前节点距离为 2 以内的所有金币,或者 移动到树中一个相邻节点。
你需要收集树中所有的金币,并且回到出发节点,请你返回最少经过的边数。
如果你多次经过一条边,每一次经过都会给答案加一。
输入:coins = [1,0,0,0,0,1], edges = [[0,1],[1,2],[2,3],[3,4],[4,5]]。
输出:2。
来自左程云。
答案2023-09-03:
代码思路:
1.创建图结构和入度数组,并初始化空图和入度数组。
2.遍历边数组,将边的两个节点加入图中,同时更新入度数组。
3.创建队列,并将所有入度为1且节点上金币为0的节点加入队列。
4.使用BFS算法遍历队列,将入度-1并将入度为1且节点上金币为0的相邻节点加入队列。
5.继续遍历队列,将入度-1并记录节点的排名,并将入度为1的相邻节点加入队列。
6.计算满足条件的边数,即排名大于等于2的边。
7.返回计数值作为最少经过的边数。
总的时间复杂度:O(n),其中n为节点数量,需要遍历边数组和节点数组,同时进行BFS操作。
总的额外空间复杂度:O(n),需要创建图结构、入度数组和队列。
go完整代码如下:
package main
import "fmt"
func collectTheCoins(coins []int, edges [][]int) int {
n := len(coins)
graph := make([][]int, n)
inDegree := make([]int, n)
for i := 0; i < n; i++ {
graph[i] = []int{}
}
for _, edge := range edges {
graph[edge[0]] = append(graph[edge[0]], edge[1])
graph[edge[1]] = append(graph[edge[1]], edge[0])
inDegree[edge[0]]++
inDegree[edge[1]]++
}
queue := make([]int, n)
l, r := 0, 0
for i := 0; i < n; i++ {
if inDegree[i] == 1 && coins[i] == 0 {
queue[r] = i
r++
}
}
for l < r {
cur := queue[l]
l++
for _, next := range graph[cur] {
if inDegree[next]--; inDegree[next] == 1 && coins[next] == 0 {
queue[r] = next
r++
}
}
}
for i := 0; i < n; i++ {
if inDegree[i] == 1 && coins[i] == 1 {
queue[r] = i
r++
}
}
rank := make([]int, n)
for l < r {
cur := queue[l]
l++
for _, next := range graph[cur] {
if inDegree[next]--; inDegree[next] == 1 {
rank[next] = rank[cur] + 1
queue[r] = next
r++
}
}
}
ans := 0
for _, edge := range edges {
if rank[edge[0]] >= 2 && rank[edge[1]] >= 2 {
ans += 2
}
}
return ans
}
func main() {
coins := []int{1, 0, 0, 0, 0, 1}
edges := [][]int{{0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}}
result := collectTheCoins(coins, edges)
fmt.Println(result)
}

rust完整代码如下:
fn collect_the_coins(coins: Vec<i32>, edges: Vec<Vec<i32>>) -> i32 {
let n = coins.len();
let mut graph: Vec<Vec<i32>> = vec![vec![]; n];
let mut in_degree: Vec<i32> = vec![0; n];
for edge in &edges {
let u = edge[0];
let v = edge[1];
graph[u as usize].push(v);
graph[v as usize].push(u);
in_degree[u as usize] += 1;
in_degree[v as usize] += 1;
}
let mut queue: Vec<i32> = vec![0; n];
let mut l = 0;
let mut r = 0;
for i in 0..n {
if in_degree[i] == 1 && coins[i] == 0 {
queue[r as usize] = i as i32;
r += 1;
}
}
while l < r {
let cur = queue[l as usize];
l += 1;
for &next in &graph[cur as usize] {
in_degree[next as usize] -= 1;
if in_degree[next as usize] == 1 && coins[next as usize] == 0 {
queue[r as usize] = next;
r += 1;
}
}
}
for i in 0..n {
if in_degree[i] == 1 && coins[i] == 1 {
queue[r as usize] = i as i32;
r += 1;
}
}
let mut rank: Vec<i32> = vec![0; n];
while l < r {
let cur = queue[l as usize] as usize;
l += 1;
for &next in &graph[cur] {
in_degree[next as usize] -= 1;
if in_degree[next as usize] == 1 {
rank[next as usize] = rank[cur] + 1;
queue[r as usize] = next;
r += 1;
}
}
}
let mut ans = 0;
for edge in &edges {
let u = edge[0] as usize;
let v = edge[1] as usize;
if rank[u] >= 2 && rank[v] >= 2 {
ans += 2;
}
}
ans
}
fn main() {
let coins = vec![0, 0, 0, 1, 1, 0, 0, 1];
let edges = vec![
vec![0, 1],
vec![0, 2],
vec![1, 3],
vec![1, 4],
vec![2, 5],
vec![5, 6],
vec![5, 7],
];
let result = collect_the_coins(coins, edges);
println!("Result: {}", result);
}

c++完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {
int n = coins.size();
vector<vector<int>> graph(n);
vector<int> inDegree(n, 0);
for (auto& edge : edges) {
graph[edge[0]].push_back(edge[1]);
graph[edge[1]].push_back(edge[0]);
inDegree[edge[0]]++;
inDegree[edge[1]]++;
}
vector<int> queue;
int l = 0, r = 0;
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 1 && coins[i] == 0) {
queue.push_back(i);
r++;
}
}
while (l < r) {
int cur = queue[l++];
for (int next : graph[cur]) {
if (--inDegree[next] == 1 && coins[next] == 0) {
queue.push_back(next);
r++;
}
}
}
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 1 && coins[i] == 1) {
queue.push_back(i);
r++;
}
}
vector<int> rank(n, 0);
while (l < r) {
int cur = queue[l++];
for (int next : graph[cur]) {
if (--inDegree[next] == 1) {
rank[next] = rank[cur] + 1;
queue.push_back(next);
r++;
}
}
}
int ans = 0;
for (auto& edge : edges) {
if (rank[edge[0]] >= 2 && rank[edge[1]] >= 2) {
ans += 2;
}
}
return ans;
}
int main() {
vector<int> coins = { 1, 0, 0, 0, 0, 1 };
vector<vector<int>> edges = { {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5} };
int result = collectTheCoins(coins, edges);
cout << result << endl;
return 0;
}

c完整代码如下:
#include <stdio.h>
#include <stdlib.h>
int collectTheCoins(int* coins, int coinsSize, int** edges, int edgesSize, int* edgesColSize) {
int n = coinsSize;
int** graph = (int**)malloc(n * sizeof(int*));
int* inDegree = (int*)calloc(n, sizeof(int));
for (int i = 0; i < n; i++) {
graph[i] = (int*)malloc(n * sizeof(int));
}
for (int i = 0; i < edgesSize; i++) {
int v = edges[i][0];
int u = edges[i][1];
graph[v][u] = 1;
graph[u][v] = 1;
inDegree[v]++;
inDegree[u]++;
}
int* queue = (int*)malloc(n * sizeof(int));
int l = 0, r = 0;
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 1 && coins[i] == 0) {
queue[r++] = i;
}
}
while (l < r) {
int cur = queue[l++];
for (int next = 0; next < n; next++) {
if (graph[cur][next] == 1) {
if (--inDegree[next] == 1 && coins[next] == 0) {
queue[r++] = next;
}
}
}
}
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 1 && coins[i] == 1) {
queue[r++] = i;
}
}
int* rank = (int*)calloc(n, sizeof(int));
while (l < r) {
int cur = queue[l++];
for (int next = 0; next < n; next++) {
if (graph[cur][next] == 1) {
if (--inDegree[next] == 1) {
rank[next] = rank[cur] + 1;
queue[r++] = next;
}
}
}
}
int ans = 0;
for (int i = 0; i < edgesSize; i++) {
if (rank[edges[i][0]] >= 2 && rank[edges[i][1]] >= 2) {
ans += 2;
}
}
// 释放动态分配的内存
for (int i = 0; i < n; i++) {
free(graph[i]);
}
free(graph);
free(inDegree);
free(queue);
free(rank);
return ans;
}
int main() {
int coins[] = { 1, 0, 0, 0, 0, 1 };
int* edges[] = {
(int[]) {
0, 1
},
(int[]) {
1, 2
},
(int[]) {
2, 3
},
(int[]) {
3, 4
},
(int[]) {
4, 5
}
};
int coinsSize = sizeof(coins) / sizeof(coins[0]);
int edgesSize = sizeof(edges) / sizeof(edges[0]);
int edgesColSize[] = { 2, 2, 2, 2, 2 };
int result = collectTheCoins(coins, coinsSize, edges, edgesSize, edgesColSize);
printf("Result: %d\n", result);
return 0;
}

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =的更多相关文章
- Task 4.4二维环形数组求最大子矩阵之和
任务: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数 ...
- 子串查询(二维前缀数组) 2018"百度之星"程序设计大赛 - 资格赛
子串查询 Time Limit: 3500/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- PHP二维关联数组的遍历方式
采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...
- C++ 指针二维数组, C++二维指针数组笔记
C++ 二维动态数组 一. 已知第一维 #include <iostream> using namespace std; int main(int argc, char const *ar ...
- 二维字符数组利用gets()函数输入
举例: ][]; ;i<;i++) gets(a[i]); a是二维字符数组的数组名,相当于一维数组的指针, 所以a[i]就相当于指向第i个数组的指针,类型就相当于char *,相当于字符串.
- 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector
先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...
- 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理
//给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...
- go 动态数组 二维动态数组
go使用动态数组还有点麻烦,比python麻烦一点,需要先定义. 动态数组申明 var dynaArr []string 动态数组添加成员 dynaArr = append(dynaArr, &quo ...
- 【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
[问题] 定义了一个子函数,传参的内容是一个二维数组 编译提示错误 因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址) [二维数组的传参] 方法一:形参为二维 ...
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组a[n ...
随机推荐
- lxml中xpath获取当前节点所有子节点的文本方法
一.场景还原 现在假定有如下html代码: <div class="content"> <p>输入只有一行半径r.</p> </div&g ...
- 【熊子q的代码乐园】用python写个健康报备记录小系统
目录 一.前言 二.技术实现 1.概述 2. 环境 3. 技术核心 4. 数据库 5. 源代码 三.最后 一.前言 coding的一路上,遇到过许多问题,也写过一些代码去解决,回头看看还是有点意思的, ...
- weexplus真机调试
一.连接真机 C:\Users\Lenovo>adb devices List of devices attached C9K7N15722004375 device 确定连接无误,否则执行we ...
- C++面试八股文:指针占用多少个字节?
某日小二参加XXX科技公司的C++工程师开发岗位4面: 面试官:memset.memcpy和strcpy的区别是什么? 小二:memset用于将一块内存设置为特定的值, memcpy用于将一块内存从一 ...
- [Java SE] 彻底搞懂Java程序的三大参数配置途径:系统变量与JVM参数(VM Option)/环境变量/启动程序参数args
0 序言 一次没搞懂,处处受影响.这个问题属于基础问题,但又经常踩坑,不得不重视一下了. 1 Java程序动态参数的配置途径:系统变量与JVM参数(VM Option) vs 环境变量 vs 启动程序 ...
- 【leetcode】# 7 整数翻转 Rust Solution
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转.示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设 ...
- .net 项目静态文件自动压缩打包
打包工具选型 在 ASP.NET MVC 时代,我们常使用 BundleCollection 设置需要打包压缩的 js 和 css 文件,运行时框架会自动处理打包压缩过程并将最终结果传入响应. ASP ...
- Java Websocket 02: 原生模式通过 Websocket 传输文件
目录 Java Websocket 01: 原生模式 Websocket 基础通信 Java Websocket 02: 原生模式通过 Websocket 传输文件 Websocket 原生模式 传输 ...
- Jupyter无法运行websocket错误
Juputer无法连接 系websocket连接出问题,浏览器控制台报错 ws 连接异常 WebSocket connection to 'ws://localhost:8888/api/kernel ...
- Profinet转EtherNet/IP网关连接AB PLC的应用案例
西门子S7-1500 PLC(profinet)与AB PLC以太网通讯(EtherNet/IP).本文主要介绍捷米特JM-EIP-PN的Profinet转EtherNet/IP网关,连接西门子S7- ...