首页 > 其他分享 >代码随想录day29 || 134 加油站,135 分糖果,860 柠檬水找零,406 根据身高重建队列

代码随想录day29 || 134 加油站,135 分糖果,860 柠檬水找零,406 根据身高重建队列

时间:2024-08-14 11:50:39浏览次数:13  
标签:10 return exchange int res people 随想录 找零 柠檬水

加油站

func canCompleteCircuit(gas []int, cost []int) int {
	// 思路,首先统计一个差值数组,表示行驶到下一个加油站可以补充的油量,然后加总差值数组,
	// 如果小于0,表示从起始位置到目前为止剩余油量小于0,不足以跑完全程,同时将起始位置放到遍历的下一个位置

	if len(gas) == 0 || len(cost) == 0 {
		return 0
	}

	// 如果跑完全程所消耗油量小于提供油量,那么无法跑完
	var total int
	for i := 0; i < len(gas); i++ {
		total += gas[i] - cost[i]
	}
	if total < 0 {
		return -1
	}

	var start, cursum int
	for i:=0; i<len(gas); i++ {
		cursum += gas[i] - cost[i]
		if cursum < 0 {
			start = i+1
			cursum = 0
		}
	}
	return start
}

135 分糖果

func candy(ratings []int) int {
	// 思路,对比分数需要考虑和左右两边对比的情况,所以优先考虑一侧,然后再计算另一个,两边取最值即可
	if len(ratings) == 1 {
		return 1
	}


	var length = len(ratings)
	var left, right = make([]int, length), make([]int, length)
	left[0] = 1
	right[length - 1] = 1
	for i:=1; i<length; i++ {
		if ratings[i] > ratings[i-1] {
			left[i] = left[i-1] + 1 // 如果评分高于左边,那么给予数量多一个
		}else {
			left[i] = 1
		}
	}

	// 为什么这里要倒序遍历呢?因为如果还是正序,那么就和上面的遍历过程一致了,我们的初始位置一定是最后一位,这样才能再基础上对比加数量
	for i:=length-2; i >= 0; i--{
		if ratings[i] > ratings[i+1] {
			right[i] = right[i+1] + 1
		}else {
			right[i] = 1
		}
	}

	var res int
	//fmt.Println(left, right)
	for i:=0; i<length; i++{
		if right[i] > left[i] {
			res += right[i]
		}else {
			res += left[i]
		}
	}
	return res
}

135 柠檬水找零

func lemonadeChange(bills []int) bool {
	// 思考一下,遍历数组,如果5,跳过,如果10,检查map是否有5,如果20,优先检查10,然后检查5
	var exchange = make(map[int]int) // bill; count

	for _, v := range bills {
		switch v {
		case 5:
			exchange[5]++
		case 10:
			// 检查是否有5的零钱
			if exchange[5] == 0 {
				return false
			}

			exchange[5]--
			exchange[10]++
		case 20:// 20 不必存入map,因为根本没有找零作用
			// 优先匹配10+5 次要匹配5+5+5
			if exchange[5] > 0 && exchange[10] > 0 ||
				exchange[5] >= 3 {
				if exchange[10] > 0 {
					exchange[10]--
					exchange[5]--
				}else {
					exchange[5] -= 3
				}
			}else {
				return false
			}
		}

	}
	return true
}

135 根据身高重建队列

image

func reconstructQueue(people [][]int) [][]int {
	sort.Slice(people, func(i, j int) bool {
		if people[i][0] == people[j][0] {
			return people[i][1] < people[j][1]  // 位次升序
		}
		return people[i][0] > people[j][0] // 身高降序
	})
	fmt.Println(people)

	
	var res [][]int
	for _, v := range people {
		idx := v[1]
		res = append(res[0 : idx], append([][]int{v}, res[idx : ]...)...)
	}

	return res
}

标签:10,return,exchange,int,res,people,随想录,找零,柠檬水
From: https://www.cnblogs.com/zhougongjin55/p/18358589

相关文章

  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • 代码随想录Day14
    226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内-100<=Node.val<=100......
  • 代码随想录算法训练营第 42 天 |LeetCode 188.买卖股票的最佳时机IV LeetCode309.最佳
    代码随想录算法训练营Day42代码随想录算法训练营第42天|LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖股票时机含冷冻期LeetCode714.买卖股票的最佳时机含手续费目录代码随想录算法训练营前言LeetCode188.买卖股票的最佳时机IVLeetCode309.最佳买卖......
  • 代码随想录算法训练营第十三天|二叉树理论基础,144.二叉树的前序遍历,145.二叉树的中序
    day12周日放假二叉树理论基础:文章链接:代码随想录文章摘要:满二叉树定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一......
  • 代码随想录day28 || 122 买卖最佳时机2,55 跳跃游戏,45 跳跃游戏2,1005 k次取反最大数组
    122买卖股票最佳时机2funcmaxProfit(prices[]int)int{ //思路,因为支持同一天买入卖出,所以利润最大应该是所有正利润的加总结果 varsumint fori:=1;i<len(prices);i++{ ifprices[i]-prices[i-1]>0{ sum+=prices[i]-prices[i-1] } } returns......
  • 代码随想录Day12
    二叉树遍历分为前序、中序、后续、层序四种其中前中后序属于深度优先搜索,层序属于广度优先搜索前序遍历顺序:根节点->左子树->右子树中序遍历顺序:左子树->根节点->右子树后序遍历顺序:左子树->右子树->根节点不难发现,前中后其实就是根节点在遍历中的位置至于层序遍历,顾名......
  • 「代码随想录算法训练营」第三十五天 | 动态规划 part8
    121.买卖股票的最佳时机题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/文章讲解:https://programmercarl.com/0121.买卖股票的最佳时机.html题目难度:简单视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q题目状态:有一半的思路思路一:贪心对......
  • 代码随想录day27 || 455 分饼干,376 摆动序列,53 最大子序列和
    分饼干funcfindContentChildren(g[]int,s[]int)int{ //第一思路,双指针暴力解法 varcountint varused2=make([]bool,len(s)) g=quicksort(g) s=quicksort(s) for_,child:=rangeg{ foridx,cookie:=ranges{ if!used2[idx]&&cookie>=......
  • 代码随想录Day11
    150.逆波兰表达式求值给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*'和'/'。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总是......