Golang每日一练(leetDay0089) 滑动窗口最大值、中位数

news2024/10/6 10:35:48

目录

239. 滑动窗口最大值 Sliding Window Maximum  🌟🌟🌟

480. 滑动窗口中位数 Sliding Window Median  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


239. 滑动窗口最大值 Sliding Window Maximum

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
 滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
  • 1 <= k <= nums.length

代码1: 暴力枚举

package main

import "fmt"

func maxSlidingWindow(nums []int, k int) []int {
	ans := make([]int, len(nums)-k+1)
	for i := 0; i <= len(nums)-k; i++ {
		max := nums[i]
		for j := i + 1; j < i+k; j++ {
			if nums[j] > max {
				max = nums[j]
			}
		}
		ans[i] = max
	}
	return ans
}

func main() {
	nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
	k := 3
	fmt.Println(maxSlidingWindow(nums, k))
	nums = []int{1}
	k = 1
	fmt.Println(maxSlidingWindow(nums, k))
}

代码2: 双端队列

package main

import "fmt"

func maxSlidingWindow(nums []int, k int) []int {
	var ans []int
	q := make([]int, 0) // 双端队列,存放的是数字的下标
	for i, num := range nums {
		if len(q) > 0 && q[0] < i-k+1 {
			// 当前滑动窗口的左端已离队列滑出,则要将该元素从队列中弹出
			q = q[1:]
		}
		// 将当前数字与双端队列队尾数字比较,如果当前数字大于队列数字,则弹出队列。
		// 这是因为当前数字更大,而队列中以前数字已经没有用处,我们可以弹出它们。
		for len(q) > 0 && nums[q[len(q)-1]] < num {
			q = q[:len(q)-1]
		}
		// 将当前数字下标加入队列
		q = append(q, i)
		// 到了一个滑动窗口的结束,将当前窗口中的最大值加入结果集中
		if i >= k-1 {
			ans = append(ans, nums[q[0]])
		}
	}
	return ans
}

func main() {
	nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
	k := 3
	fmt.Println(maxSlidingWindow(nums, k))
	nums = []int{1}
	k = 1
	fmt.Println(maxSlidingWindow(nums, k))
}

代码: 动态规划

package main

import "fmt"

func maxSlidingWindow(nums []int, k int) []int {
	n := len(nums)
	leftMax := make([]int, n)
	rightMax := make([]int, n)
	// 计算leftMax数组
	for i := 0; i < n; i++ {
		if i%k == 0 {
			leftMax[i] = nums[i]
		} else {
			leftMax[i] = max(leftMax[i-1], nums[i])
		}
	}
	// 计算rightMax数组
	for i := n - 1; i >= 0; i-- {
		if i == n-1 || (i+1)%k == 0 {
			rightMax[i] = nums[i]
		} else {
			rightMax[i] = max(rightMax[i+1], nums[i])
		}
	}
	// 获取每个窗口的最大值
	ans := make([]int, n-k+1)
	for i := 0; i <= n-k; i++ {
		ans[i] = max(rightMax[i], leftMax[i+k-1])
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func main() {
	nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
	k := 3
	fmt.Println(maxSlidingWindow(nums, k))
	nums = []int{1}
	k = 1
	fmt.Println(maxSlidingWindow(nums, k))
}

输出:

[3 3 5 5 6 7]

[1]


480. 滑动窗口中位数 Sliding Window Median

中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。

例如:

  • [2,3,4],中位数是 3
  • [2,3],中位数是 (2 + 3) / 2 = 2.5

给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。

示例:

给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。

 窗口位置                      中位数
---------------               -----
[1  3  -1] -3  5  3  6  7       1
 1 [3  -1  -3] 5  3  6  7      -1
 1  3 [-1  -3  5] 3  6  7      -1
 1  3  -1 [-3  5  3] 6  7       3
 1  3  -1  -3 [5  3  6] 7       5
 1  3  -1  -3  5 [3  6  7]      6

因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]

提示:

  • 你可以假设 k 始终有效,即:k 始终小于等于输入的非空数组的元素个数。
  • 与真实值误差在 10^-5 以内的答案将被视作正确答案。

代码: 暴力枚举

package main

import (
	"fmt"
	"sort"
)

func medianSlidingWindow(nums []int, k int) []float64 {
	n := len(nums)
	if k == 1 {
		ans := make([]float64, n)
		for i := 0; i < n; i++ {
			ans[i] = float64(nums[i])
		}
		return ans
	}
	ans := make([]float64, n-k+1)
	for i := 0; i <= n-k; i++ {
		tmp := make([]int, k)
		copy(tmp, nums[i:i+k])
		sort.Ints(tmp)
		if k%2 == 0 {
			ans[i] = float64(tmp[k/2-1]+tmp[k/2]) / 2
		} else {
			ans[i] = float64(tmp[k/2])
		}
	}
	return ans
}

func main() {
	nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
	k := 3
	fmt.Println(medianSlidingWindow(nums, k))
}

输出:

[1 -1 -1 3 5 6]


🌟 每日一练刷题专栏 🌟

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

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

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

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

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

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

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

相关文章

chatgpt赋能python:Python安装FBProphet:绝佳的时间序列预测工具

Python安装FBProphet&#xff1a;绝佳的时间序列预测工具 随着时间序列数据应用场景的不断增加&#xff0c;越来越多的数据科学家和工程师开始使用FBProphet进行时间序列预测。FBProphet是由Facebook开发的一种开源预测工具&#xff0c;它使用先进的统计方法进行时间序列分析&…

案例40:基于Springboot疫苗预约系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Day_41顺序查找与折半查找

目录 一. 顺序查找和折半查找的实现 1. 顺序查找 1.1 一般线性表的顺序查找 1.2 有序表的顺序查找 2. 折半查找 二. 代码实现 1. 内部节点 2. 类的构造函数 3. 顺序查找 4. 折半查找 三. 代码展示 四. 数据测试 五. 小结 一. 顺序查找和折半查找的实现 1. 顺序查找…

chatgpt赋能python:Python定义错误:什么是Python定义错误

Python定义错误&#xff1a;什么是Python定义错误 Python是一种强大的编程语言&#xff0c;被广泛用于各种领域&#xff0c;例如Web开发&#xff0c;数据分析&#xff0c;机器学习等。然而&#xff0c;即使是最有经验的Python开发人员也会犯一些常见的错误&#xff0c;其中之一…

在线教育机构的视频如何做防下载和防盗录?

在线教育平台付费课程、企业内训的培训课程&#xff0c;这类视频课程内容是如何做防下载和防盗录的&#xff1f; 1.AI隐形溯源水印 这个功能能够将水印隐藏在视频中&#xff0c;不会影响观看体验&#xff0c;但却能够帮助企业很好的视频版权保护。更重要的是&#xff0c;对于盗…

【ArcGIS Pro二次开发】(34):从字符串中提取中文、英文、数字与特殊符号

这是一个基于字段计算的工具。 有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字&#xff0c;这个工具的目的是从这些复杂文字中提取出想要的特定文字。 比如说从CAD测绘图中可以读取到类似【混3】、【砖2】的文字&#xff0c;如果想要从中提取出层数或结构&…

chatgpt赋能python:Python宏变量——简介

Python宏变量——简介 Python是一种高级编程语言&#xff0c;具有易学易用、简洁清晰等优点。但我们在编写代码的时候&#xff0c;有时需要用到常量或者宏定义&#xff0c;这就需要用到宏变量。在Python中&#xff0c;宏变量是一种常见的编程方法&#xff0c;本文将详细介绍Py…

chatgpt赋能python:Python安装后怎么使用?

Python安装后怎么使用&#xff1f; Python是一种高级编程语言&#xff0c;被广泛用于Web开发、数据分析、人工智能和自动化等领域。下面我们将介绍安装Python后如何使用它。 步骤1 - 安装Python 首先&#xff0c;从官方网站下载并安装Python。在安装过程中&#xff0c;您可以…

chatgpt赋能python:Python中的构造方法是什么?

Python中的构造方法是什么&#xff1f; 当你开始学习 Python 编程时&#xff0c;你可能经常听到 “构造方法” 这个词。那么&#xff0c;什么是构造方法&#xff1f;为什么它在 Python 中很重要&#xff1f;本文将为您揭示构造方法的概念以及它们在 Python 中的作用。 什么是…

案例36:基于Springboot药店管理系统开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

chatgpt赋能python:Python程序员必知的Geany配置技巧

Python程序员必知的Geany配置技巧 如果你是一名Python程序员&#xff0c;并且正在寻找一个简单易用的代码编辑器&#xff0c;那么Geany是一个非常不错的选择。Geany是一款轻量级的集成开发环境&#xff08;IDE&#xff09;&#xff0c;除了Python&#xff0c;还支持许多其他编…

chatgpt赋能python:Python安装完后如何打开

Python安装完后如何打开 Python是一种高级的、解释性、交互式的编程语言&#xff0c;已经成为了广泛的编程应用领域中不可或缺的一部分&#xff0c;如网络编程、数据科学和人工智能等。Python的安装对于学习、开发和应用Python技术非常重要&#xff0c;但安装了Python后如何打…

案例38:基于Springboot电影评论网站开题报告设计

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

chatgpt赋能python:Python中的Gevent:安装和使用

Python 中的 Gevent: 安装和使用 Gevent 是 Python 生态系统中的一个流行的高性能网络库&#xff0c;它是基于 libev 的 Python 网络库&#xff0c;提供了非阻塞IO、协程和并发编程等方面的特性。Gevent 使得开发高性能的网络应用程序变得简单而易行。本文将介绍如何在 Python…

【Leetcode】78 子集 | 保存遍历路径上的所有节点 // 46 排列 | 使用辅助数组记录元素是否使用

78 子集 与组合问题相比&#xff0c;需要保存路上经过的所有节点。 写法1 分为选择第 i i i个元素和不选择第 i i i个元素两种情况递归。 每push进一个元素&#xff0c;代表进入了一个新的节点&#xff0c;就保存当前的路径。 import java.util.ArrayList; import java.uti…

JUC基础-0606

9.ReentrantReadWriteLock读写锁 9.1 锁的基本概念 悲观锁&#xff1a;不支持并发&#xff0c;效率低&#xff0c;但是可以解决所有并发安全问题 乐观锁&#xff1a;支持并发读&#xff0c;维护一个版本号&#xff0c;写的时候比较版本号进行控制&#xff0c;先提交的版本号…

chatgpt赋能python:Python配置指南:提高SEO效果的关键

Python配置指南&#xff1a;提高SEO效果的关键 Python作为一种高效、易学易用的编程语言&#xff0c;在数据科学、机器学习、网络编程等领域得到了广泛应用。作为一个网站管理员&#xff0c;如何让Python支持的应用程序尽可能地符合搜索引擎优化&#xff08;SEO&#xff09;的…

UI自动化测试之Jenkins配置

团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中和易用性有很大关系…

chatgpt赋能python:Python安装教程:一步步实现Python开发环境搭建

Python安装教程&#xff1a;一步步实现Python开发环境搭建 Python是一种高效、易读、易维护的编程语言。在人工智能、数据科学、Web开发等领域都有广泛的应用。如果你是一名初学者或Python开发者&#xff0c;本文将为你提供Python安装教程。 第一步&#xff1a;下载Python安装…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…