IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> golang力扣leetcode 第 285 场周赛 -> 正文阅读

[数据结构与算法]golang力扣leetcode 第 285 场周赛

前言

一共四题,AC三题,第四题线段树不搞acm了根本写不出来- -,懒得复习一遍了,就写三题的题解吧

第一题

2210.统计数组中峰和谷的数量

2210.统计数组中峰和谷的数量

题解

简单题,直接模拟就行了,不过题目中说的是左边第一个不相等和右边第一个不相等,相等的要跳过再去找,所有这里用两个for找出l和r

代码

func countHillValley(nums []int) int {
	mp := make(map[int]int)
	ans := 0
	for i := 1; i <= len(nums)-1-1; i++ {
		l, r := i-1, i+1
		for l >= 0 && nums[l] == nums[i] {
			l--
		}
		for r <= len(nums)-1 && nums[r] == nums[i] {
			r++
		}
		if l >= 0 && r <= len(nums)-1 {
			if nums[i] > nums[l] && nums[i] > nums[r] {
				mp[i] = 1
				if mp[i-1] == 1 {
					continue
				}
				ans++
			} else if nums[i] < nums[l] && nums[i] < nums[r] {
				mp[i] = -1
				if mp[i-1] == -1 {
					continue
				}
				ans++
			}
		}
	}
	return ans
}

第二题

2211.统计道路上的碰撞次数

2211.统计道路上的碰撞次数

题解

两个方向相反的车相撞加2分,s车被撞加1分,其实就是每个撞车都会贡献1分,不分左右,因为RL=2,R=1,L=1,所以除了开头的LLL和结尾的RRR会跑出去,中间的都会撞,那么就统计L和R有多少个就行了

代码

func countCollisions(directions string) int {
	l, r := 0, len(directions)-1
	ans := 0
	for l <= len(directions)-1 && directions[l] == 'L' {
		l++
	}
	for r >= 0 && directions[r] == 'R' {
		r--
	}
	for i := l; i <= r; i++ {
		if directions[i] == 'L' || directions[i] == 'R' {
			ans++
		}
	}
	return ans
}

第三题

2212.射箭比赛中的最大得分

2212.射箭比赛中的最大得分

题解

两种思路

  1. dfs+回溯,贪心,想要得分高,就从分高的区域开始计算,对于每个区域,有不射和比A多射一支的选择,那么就dfs即可,注意如果到了0区域,还有多的剑,就都给0就好了
  2. 二进制枚举,一共12个区域,2^12次,全部枚举一遍即可

代码

  1. dfs+回溯
func maximumBobPoints(numArrows int, aliceArrows []int) (ans []int) {
	score, cnt := 0, 0
	ans, cntSlice := make([]int, len(aliceArrows)), make([]int, len(aliceArrows))
	var dfs func(numArrows int, idx int)
	dfs = func(numArrows int, idx int) {
		if numArrows == 0 && idx == -1 {
			if score < cnt {
				score = cnt
				copy(ans, cntSlice)
			}
		}
		if idx <= -1 || numArrows < 0 {
			return
		}
		//不选idx
		cntSlice[idx] = 0
		dfs(numArrows, idx-1)
		//选idx
		cnt += idx
		if idx == 0 {
			cntSlice[idx] = numArrows
			dfs(0, idx-1)
		} else {
			cntSlice[idx] = aliceArrows[idx] + 1
			dfs(numArrows-aliceArrows[idx]-1, idx-1)
		}
		cnt -= idx        //回溯
		cntSlice[idx] = 0 //回溯
	}
	dfs(numArrows, 11)
	return
}
  1. 二进制枚举
func maximumBobPoints(numArrows int, aliceArrows []int) (ans []int) {
	n := 1<<len(aliceArrows) - 1
	score := 0
	for i := 0; i <= n; i++ {
		cnt := 0
		out := 0
		cntSlice := make([]int, len(aliceArrows))
		for j, v := range aliceArrows {
			if i>>j&1 == 1 { //其中一个区域如果选中了
				cnt += j            //统计分数
				out += v + 1        //统计射出去的剑
				cntSlice[j] = v + 1 //比A多射一个剑
			}
		}
		if out > numArrows {
			continue
		}
		cntSlice[0] += numArrows - out //把剩下的减都给0区域
		if score < cnt {
			score = cnt
			ans = cntSlice
		}
	}
	return
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:49:54  更:2022-03-22 20:51:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:36:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码