首页 > 其他分享 >代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II

代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II

时间:2024-09-02 12:04:34浏览次数:11  
标签:idx int res 元素 随想录 len var 更大 stack

739 每日温度

func dailyTemperatures(temperatures []int) []int {
	// 双指针
	var res = make([]int, len(temperatures))

	for i:=0; i<len(temperatures); i++ {
		for j:=i+1; j<len(temperatures); j++ {
			if temperatures[j] > temperatures[i] {
				res[i] = j - i
				break
			}
		}
	}
	return res
}

// 时间n^2, 空间n  超时

image

//leetcode submit region begin(Prohibit modification and deletion)
func dailyTemperatures(temperatures []int) []int {
	// 单调栈
	if len(temperatures) == 1{
		return []int{0}
	}
	var res = make([]int, len(temperatures))
	var topidx int
	stack := list.New()

	for i:=0; i<len(temperatures); i++ {
		if stack.Len() == 0 {
			stack.PushFront(i)
			continue
		}
		topidx = stack.Front().Value.(int)
		if temperatures[i] <= temperatures[topidx] {
			stack.PushFront(i)
		}else {
			for temperatures[topidx] < temperatures[i]{
				idx := stack.Remove(stack.Front()).(int)
				res[idx] = i - idx
				if stack.Len() > 0 {
					topidx = stack.Front().Value.(int)
				}else {
					break
				}
			}
			stack.PushFront(i)
		}
	}
	return res
}
// 简洁版本
func dailyTemperatures(temperatures []int) []int {
	// 单调栈
	n := len(temperatures)
	res := make([]int, n)
	stack := []int{} // 使用切片作为栈

	for i := 0; i < n; i++ {
		for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack)-1]] {
			idx := stack[len(stack)-1]
			stack = stack[:len(stack)-1] // 弹出栈顶元素
			res[idx] = i - idx
		}
		stack = append(stack, i) // 压栈
	}

	return res
}

496 下一个更大元素

func nextGreaterElement(nums1 []int, nums2 []int) []int {
	// 两种思路,第一双循环暴力解法,第二可以单调栈求nums2每一个元素的更大元素,然后hash表nums1,得出结果
	var res = make([]int, len(nums1))
	var hash = make(map[int]int, len(nums1))

	for idx, num := range nums1 {
		hash[num] = idx
	}

	var stack = make([]int, len(nums2))
	var res2 = make([]int, len(nums2))
	for i:=0; i<len(nums2); i++{
		for len(stack) > 0 && nums2[i] > nums2[stack[0]] {
			idx := stack[0]
			stack = stack[1: ]
			res2[idx] = nums2[i]
		}
		stack = append([]int{i}, stack...)
	}
	//fmt.Println(res2)
	for i, v := range res2 {
		if idx, ok := hash[nums2[i]]; ok {
			if v == 0 {
				res[idx] = -1
			}else {
				res[idx] = v
			}
		}
	}
	return res
}

503 下一个更大元素II

func nextGreaterElements(nums []int) []int {
	// 思路取巧一下循环,将其变成两个数组叠加

	var newNums []int  // 两个数组
	newNums = append(newNums, nums...)
	newNums = append(newNums, nums...)
	fmt.Println(newNums)
	var stack = make([]int, len(newNums))
	var res = make([]int, len(newNums))
	for i, _ := range res {  // 初始化为-1
		res[i] = -1
	}


	for i:=0; i<len(newNums); i++{
		for len(stack) > 0 && newNums[i] > newNums[stack[len(stack) - 1]] {
			idx := stack[len(stack) - 1]
			stack = stack[ : len(stack) - 1]
			res[idx] = newNums[i]
		}
		stack = append(stack, i)
	}
	//fmt.Println(res)

	return res[ : len(nums)]
}

func nextGreaterElements(nums []int) []int {
	// 正常思路,涉及到环,通过取模运算实现正确的循环

	var stack = make([]int, len(nums))
	var res = make([]int, len(nums))
	for i, _ := range res {  // 初始化为-1
		res[i] = -1
	}

	length := len(nums)
	for i:=0; i<length * 2; i++{
		for len(stack) > 0 && nums[i % length] > nums[stack[len(stack) - 1]] {
			idx := stack[len(stack) - 1]
			stack = stack[ : len(stack) - 1]
			res[idx] = nums[i % length]
		}
		stack = append(stack, i % length)
	}
	//fmt.Println(res)

	return res
}

标签:idx,int,res,元素,随想录,len,var,更大,stack
From: https://www.cnblogs.com/zhougongjin55/p/18392461

相关文章

  • "waitForSelector"在元素可见前超时等待,尽管元素在屏幕上
    waitForSelector方法在元素可见前超时等待,尽管元素在屏幕上,可能是由于以下原因:元素被隐藏或覆盖:元素可能被其他元素隐藏或覆盖,导致waitForSelector方法无法正确检测到元素的可见性。元素加载延迟:元素可能需要一定的时间来加载和显示,而waitForSelector方法的超时时间可能设置得......
  • 力扣230题详解:二叉搜索树中第K小的元素的多种解法与模拟面试问答
    在本篇文章中,我们将详细解读力扣第230题“二叉搜索树中第K小的元素”。通过学习本篇文章,读者将掌握如何在二叉搜索树中高效地查找第K小的元素,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。问题描述力扣第230题“二叉搜索树中第K小的元素......
  • 代码随想录算法day4 - 哈希表2
    题目1454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4......
  • 代码随想录刷题day13丨二叉树理论基础,递归遍历,迭代遍历,统一迭代,层序遍历
    代码随想录刷题day13丨二叉树理论基础,递归遍历,迭代遍历,统一迭代,层序遍历1.二叉树理论基础1.1二叉树种类满二叉树概述:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节......
  • 基于soui4实现一个打印排版软件(六)条形码元素控件
    条码生成使用了开源库zint。该库实现了全部的常用码制。在项目头文件中将库导入项目://zint#include"../zint/include/backend/zint.h"#ifdef_DEBUG#pragmacomment(lib,"../zint/lib/debug/zint.lib")#else#pragmacomment(lib,"../zint/lib/release/zint.lib")......
  • [python][selenium][web自动化]元素定位方式
    8种方式:1、id2、class_name3、name4、link_text5、partial_link_text6、tag_name7、css_selector8、XPath1、2、3:元素属性,通常跟7、8去组合使用比较多。4、5:是用可点击的链接的文本去定位。6:是根据元素标签去定位。7、8:最常用的方式,能结合前面6种方式组合去定位,我个人觉得理解后......
  • CSS 中的图像、媒体和表单元素——WEB开发系列23
    Web开发中,图像、媒体和表单元素是构建用户界面的重要组成部分。正确地使用CSS来处理这些元素可以大幅提高用户体验,增强页面的美观性和功能性。一、什么是替换元素?图像和视频被描述为“替换元素”。这意味着CSS不能影响它们的内部布局——而仅影响它们在页面上相对于其他元素的......
  • 「代码随想录算法训练营」第五十一天 | 图论 part9
    目录Bellman_ford算法模拟过程题目:94.城市间货物运输IBellman_ford队列优化算法(又名SPFA)模拟过程题目:94.城市间货物运输IBellman_ford算法之判断负权回路题目:95.城市间货物运输IIBellman_ford算法之单源有限最短路题目:96.城市间货物运输IIIBellman_ford算法Bellman_ford算法......
  • 代码随想录算法day5 - 哈希表1
    题目1242.有效的字母异位词给定两个字符串*s*和*t*,编写一个函数来判断*t*是否是*s*的字母异位词。字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,通常只使用所有原始字母一次。示例1:输入:s="anagram",t="nagaram"输出:true示例2:......
  • XSLT的元素语法
    XSLT的元素语法xsl:template和xsl:apply-templatesxsl:value-ofxsl:for-eachxsl:ifXxsl:choose,when,otherwisexsl:sortxsl:template和xsl:apply-templates模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一个一个的模板组成,任何一个XSLT文件至少包含一个模板。......