Golang每日一练(leetDay0045)

news2024/12/23 14:15:53

目录

133. 克隆图 Clone Graph  🌟🌟

134. 加油站 Gas Station  🌟🌟

135. 分发糖果 Candy  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


133. 克隆图 Clone Graph

给你无​向 连通图 ​中一个节点的引用,请你返回该图的​深拷贝(​克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(list[Node])。

class Node {
    public int val;
    public List<Node> neighbors;
}

测试用例格式:

简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。

邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。

给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

示例 1:

输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。

示例 2:

输入:adjList = [[]]
输出:[[]]
解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。

示例 3:

输入:adjList = []
输出:[]
解释:这个图是空的,它不含任何节点。

示例 4:

输入:adjList = [[2],[1]]
输出:[[2],[1]]

提示:

  1. 节点数不超过 100 。
  2. 每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100
  3. 无向图是一​个简单图,​这意味着图中没有重复的边,也没有自环。
  4. 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
  5. 图是连通图,你可以从给定节点访问到所有节点。

代码:

package main

import "fmt"

type Node struct {
	Val       int
	Neighbors []*Node
}

func cloneGraph(nodes []*Node) []*Node {
	n := len(nodes)
	clone := make([]*Node, n)
	for i := 0; i < n; i++ {
		visited := make(map[*Node]*Node)
		clone[i] = dfs(nodes[i], visited)
	}
	return clone
}

func dfs(node *Node, visited map[*Node]*Node) *Node {
	if node == nil {
		return nil
	}
	// 如果已经访问过,直接返回
	if n, ok := visited[node]; ok {
		return n
	}
	// 深拷贝节点
	copy := &Node{Val: node.Val}
	visited[node] = copy
	// 深拷贝邻居节点
	for _, neighbor := range node.Neighbors {
		copy.Neighbors = append(copy.Neighbors, dfs(neighbor, visited))
	}
	return copy
}

func createGraph(arr [][]int) []*Node {
	n := len(arr)
	nodes := make([]*Node, n)
	for i := 1; i <= n; i++ {
		nodes[i-1] = &Node{Val: i}
	}
	for i := 1; i <= n; i++ {
		for _, j := range arr[i-1] {
			nodes[i-1].Neighbors = append(nodes[i-1].Neighbors, nodes[j-1])
		}
	}
	return nodes
}

func printGraph(nodes []*Node) {
	for _, node := range nodes {
		neighbors := make([]int, len(node.Neighbors))
		for i, neighbor := range node.Neighbors {
			neighbors[i] = neighbor.Val
		}
		fmt.Printf("%d: %v ", node.Val, neighbors)
	}
	fmt.Println()
}

func main() {
	adjList := [][]int{{2, 4}, {1, 3}, {2, 4}, {1, 3}}
	nodes := createGraph(adjList)
	printGraph(nodes)
	clone := cloneGraph(nodes)
	printGraph(clone)
	adjList = [][]int{{2, 3, 4}, {1, 3}, {1, 2, 4}, {1, 3}}
	nodes = createGraph(adjList)
	printGraph(nodes)
	clone = cloneGraph(nodes)
	printGraph(clone)
	adjList = [][]int{{2, 3, 4}, {1, 3, 4}, {1, 2, 4}, {1, 2, 3}}
	nodes = createGraph(adjList)
	printGraph(nodes)
	clone = cloneGraph(nodes)
	printGraph(clone)
	adjList = [][]int{{2}, {1}}
	nodes = createGraph(adjList)
	printGraph(nodes)
	clone = cloneGraph(nodes)
	printGraph(clone)
}

输出:

1: [2 4] 2: [1 3] 3: [2 4] 4: [1 3]
1: [2 4] 2: [1 3] 3: [2 4] 4: [1 3]
1: [2 3 4] 2: [1 3] 3: [1 2 4] 4: [1 3]
1: [2 3 4] 2: [1 3] 3: [1 2 4] 4: [1 3]
1: [2 3 4] 2: [1 3 4] 3: [1 2 4] 4: [1 2 3]
1: [2 3 4] 2: [1 3 4] 3: [1 2 4] 4: [1 2 3]
1: [2] 2: [1]
1: [2] 2: [1] 


134. 加油站 Gas Station

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

示例 2:

输入: gas = [2,3,4], cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

提示:

  • gas.length == n
  • cost.length == n
  • 1 <= n <= 10^5
  • 0 <= gas[i], cost[i] <= 10^4

代码1: 暴力枚举

package main

import (
	"fmt"
)

func canCompleteCircuit(gas []int, cost []int) int {
	n := len(gas)
	for i := 0; i < n; i++ {
		if gas[i] < cost[i] {
			continue
		}
		tank := 0
		for j := 0; j < n; j++ {
			k := (i + j) % n
			tank += gas[k] - cost[k]
			if tank < 0 {
				break
			}
		}
		if tank >= 0 {
			return i
		}
	}
	return -1
}

func main() {
	gas := []int{1, 2, 3, 4, 5}
	cost := []int{3, 4, 5, 1, 2}
	fmt.Println(canCompleteCircuit(gas, cost))
	gas = []int{2, 3, 4}
	cost = []int{3, 4, 3}
	fmt.Println(canCompleteCircuit(gas, cost))
}

代码2: 贪心算法

package main

import (
	"fmt"
)

func canCompleteCircuit(gas []int, cost []int) int {
	n := len(gas)
	start, total, tank := 0, 0, 0
	for i := 0; i < n; i++ {
		total += gas[i] - cost[i]
		tank += gas[i] - cost[i]
		if tank < 0 {
			start = i + 1
			tank = 0
		}
	}
	if total < 0 {
		return -1
	} else {
		return start
	}
}

func main() {
	gas := []int{1, 2, 3, 4, 5}
	cost := []int{3, 4, 5, 1, 2}
	fmt.Println(canCompleteCircuit(gas, cost))
	gas = []int{2, 3, 4}
	cost = []int{3, 4, 3}
	fmt.Println(canCompleteCircuit(gas, cost))
}

输出:

3
-1


135. 分发糖果 Candy

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

示例 2:

输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

提示:

  • n == ratings.length
  • 1 <= n <= 2 * 10^4
  • 0 <= ratings[i] <= 2 * 10^4

代码1:

package main

import "fmt"

func candy(ratings []int) int {
	n := len(ratings)
	if n == 0 {
		return 0
	}
	candies := make([]int, n)
	for i := 0; i < n; i++ {
		candies[i] = 1
	}
	for i := 1; i < n; i++ {
		if ratings[i] > ratings[i-1] {
			candies[i] = candies[i-1] + 1
		}
	}
	for i := n - 2; i >= 0; i-- {
		if ratings[i] > ratings[i+1] && candies[i] <= candies[i+1] {
			candies[i] = candies[i+1] + 1
		}
	}
	sum := 0
	for i := 0; i < n; i++ {
		sum += candies[i]
	}
	return sum
}

func main() {
	ratings := []int{1, 0, 2}
	fmt.Println(candy(ratings))
	ratings = []int{1, 2, 2}
	fmt.Println(candy(ratings))
}

代码2:

package main

import "fmt"

func candy(ratings []int) int {
	n := len(ratings)
	if n == 0 {
		return 0
	}
	left := make([]int, n)
	for i := 0; i < n; i++ {
		left[i] = 1
		if i > 0 && ratings[i] > ratings[i-1] {
			left[i] = left[i-1] + 1
		}
	}
	right := make([]int, n)
	for i := n - 1; i >= 0; i-- {
		right[i] = 1
		if i < n-1 && ratings[i] > ratings[i+1] {
			right[i] = right[i+1] + 1
		}
	}
	sum := 0
	for i := 0; i < n; i++ {
		sum += max(left[i], right[i])
	}
	return sum
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	ratings := []int{1, 0, 2}
	fmt.Println(candy(ratings))
	ratings = []int{1, 2, 2}
	fmt.Println(candy(ratings))
}

输出:

5
4


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PR 基础】设置上下黑白边的两种方法

方法1 点击 文件-》新建-》旧版标题 点击确定 点击矩形工具 利用矩形工具框选出上下黑白边 款选完成后点击关闭 将刚创建的字幕拖入轨道 可以修改其持续时长与视频时长保持一致 如果想要修改字幕可以双击来修改 比如可以将颜色改为黑色 方法2 点击号&#xff0c;再选择安全边…

如何在表格里面使用VSTACK、HSTACK等函数

如何在表格里面使用VSTACK、HSTACK等函数 书接前文 ONLYOFFICE 桌面编辑器 v7.3 新功能介绍 里面介绍了最新版本的表格里面&#xff0c;添加的公式将帮助您更高效地进行数据计算&#xff1a;TEXTBEFORE、TEXTAFTER、TEXTSPLIT、VSTACK、HSTACK、TOROW、TOCOL、WRAPROWS、WRA…

IPSEC VPN

1.数据认证的介绍、作用、实现的技术手段 数据认证是指通过一系列验证过程检查数据的完整性、真实性、可靠性和准确性&#xff0c;以确保这些数据来自于已知或可信的来源。数据认证的目的是保护数据免受篡改、冒充或欺骗等威胁&#xff0c;确保数据的安全性和可信度。实现数据…

Windows 彻底卸载联软流氓软件(亲测可用)

文章目录 1、前言2、卸载步骤&#xff08;1&#xff09;打开服务&#xff0c;将所有Uni开头的服务都禁用&#xff0c;某些服务禁用后可能还是会自启&#xff0c;不过不影响&#xff08;2&#xff09;进入安全模式&#xff0c;电脑重启&#xff08;3&#xff09;重启后桌面显示了…

怎么将照片KB调小?压缩照片kb的几个方法

将照片KB调小的意思是将照片文件的大小缩小&#xff0c;使其占据更小的存储空间。在一些特定场景下&#xff0c;如网页设计、邮件发送、上传文件等&#xff0c;限制了文件大小&#xff0c;因此需要将照片压缩到规定大小以内。通常情况下&#xff0c;压缩后的照片质量会相应降低…

18.Java泛型

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句&#xff08;if、switch、for、while、foreach&#xff09; 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

关闭默认共享服务

目录 1.从网络上关闭共享协议2.禁用共享服务3.关闭防火墙共享端口4.脚本自启动删除默认共享5.修改注册表彻底屏蔽共享 共5种方法&#xff0c;推荐前三种搭配。 1.从网络上关闭共享协议 打开网络和共享中心->本地连接->属性把" Microsoft 网络的文件和打印机共享&qu…

Word如何插入图片?最全方法总结(2023新版)

案例&#xff1a;Word如何插入图片 【我最近在写毕业论文&#xff0c;需要在Word文档里添加一些图片&#xff0c;想问问大家Word如何插入图片呀&#xff1f;感谢回答&#xff01;】 Microsoft Word是一个广泛使用的文字处理软件&#xff0c;在使用中如果插入图片可以很好的丰…

优思学院|精益生产和六西格玛如何把控质量?

精益生产是一种流程改善方法&#xff0c;旨在最大程度地减少浪费和提高效率。在实施精益生产时&#xff0c;质量控制是一个重要的因素&#xff0c;因为不合格的产品会导致延误和浪费。优思学院在本文将探讨精益生产和六西格玛管理理论如何控制质量&#xff0c;以及解决产品质量…

poi-tl简介与文本/表格和图片渲染

一、poi-tl简介 下面简介来自官方文档。 官方文档&#xff1a;http://deepoove.com/poi-tl/#_why_poi_tl 1、简介 poi-tl&#xff08;poi template language&#xff09;是Word模板引擎&#xff0c;使用Word模板和数据创建很棒的Word文档。 poi-tl是一个基于Apache POI的Word模…

【Python】【进阶篇】5、Django Admin后台管理系统

目录 5、Django Admin后台管理系统1. 后台管理系统的重要性2. 了解Django后台管理功能 5、Django Admin后台管理系统 Django 的后台管理系统是非常出色的&#xff0c;新建项目以后&#xff0c;Django 就为我们设置好了后台管理系统的各种功能&#xff0c;本节我们将一起认识它…

SQLServer:Win/Linux环境安装及一键部署脚本

1. Win安装SQLServer CSDN已有完整安装流程&#xff0c;亲测可用。----》Windows安装SQLServer流程 2. Linux安装 SQLServer 2.1 设置镜像 curl https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo > /etc/yum.repos.d/mssql-server.repo 2.2 通过y…

Adobe国际认证证书有用吗?

Adobe国际认证又称为Adobe认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 该体系基于Adobe核心技术及岗位实际应用操作能力的测评体系得到国际ISTE协会的认可&#xff0c;并在全球 148 各国家推广&#x…

心理预期太大,容易失望

心理预期太大&#xff0c;是做事的障碍 心理预期与标准有关&#xff1a;亚马逊创始人谈标准 趣讲大白话&#xff1a;对事要有合理的心理预期 【趣讲信息科技144期】 **************************** 亚马逊创始人贝索斯在《长期主义》中 对高标准的四大要素&#xff1a; 1.可以通…

Node实现CSDN博客导出(后续)

前言 在2021年我实现了一个Node导出博客的功能&#xff1a;爬取接口及博客页面并导出为md文件格式。中途有许多迭代及优化以及解决了一些关键问题&#xff0c;写篇文章做个记录和review 博客更新功能 在原有的导出功能上增加了博客更新的功能&#xff0c;避免了每次都全部导…

Java7

Java7 &#xff08;一&#xff09;、集合体系&#xff08;二&#xff09;、Collection&#xff08;三&#xff09;、Collection的遍历方式3.1迭代器3.2增强for遍历3.3 Lambda表达式遍历 &#xff08;四&#xff09;、List&#xff08;五&#xff09;、数据结构5.1 栈5.2 队列5.…

C learning_8

猜数字游戏 猜数字游戏&#xff1a; 1.电脑会随机产生一个数 2.猜数字 a>猜大了&#xff0c;提醒猜大了&#xff0c;继续猜 b>猜小了&#xff0c;提醒猜小了&#xff0c;继续猜 c>猜对了&#xff0c;恭喜你&#xff0c;猜对了&#xff0c;游戏结束 3.玩完之后可以继续…

给httprunnermanager接口自动化测试平台加点颜色(一)

文章目录 一、背景1.1、部署过程略 二、使用过程2.1、新增接口列2.2、实现搜索效果 三、总结 一、背景 https://github.com/httprunner/HttpRunnerManager.git从github上找的接口测试平台&#xff0c;引入公司作为测试协同测试的平台&#xff0c;底层框架基于httprunner(reque…

SOLIDWORKS钣金设计需要考虑的折弯问题

设计需要考虑&#xff0c;究竟哪些是成型前加工&#xff0c;究竟哪些是成型后加工。 考虑工作制作工艺过程中&#xff0c;必须先折弯&#xff0c;后加工部分孔的情况有&#xff1a; 距离折弯边很近的圆孔&#xff0c;方孔&#xff0c;腰圆孔&#xff0c;螺纹等&#xff0c;下…

如何测试信号源或者发射机的回波损耗

信用源或者发射机的return loss测试过程 1.用网分线缆的第一步就是看线的抖动情况&#xff0c;后面还是要多注意 经过一系列排查后&#xff0c;选用两个抖动比较小的线缆&#xff0c;然后开始测试另外一台仪器。 2.检查测试仪器的输出功率&#xff0c;见图1 打开信号源或者发射…