代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang

代码随想录day35

随心所欲

目录

860. 柠檬水找零

406. 根据身高重建队列

 452. 用最少数量的箭引爆气球


860. 柠檬水找零

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第1张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第2张图片

思路

        这是前几天的leetcode每日一题,感觉不错,给大家讲一下。这道题目刚一看,可能会有点懵,这要怎么找零才能保证完整全部账单的找零呢?

        但仔细一琢磨就会发现,可供我们做判断的空间非常少!

        只需要维护三种金额的数量,5,10和20。

有如下三种情况:

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

        此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。

        而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。

        账单是20的情况,为什么要优先消耗一个10和一个5呢?

        因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!

        所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

        局部最优可以推出全局最优,并找不出反例,那么就试试贪心算法!

func lemonadeChange(bills []int) bool {
    five := 0
    ten := 0
    twenty := 0
    for _, v := range bills {
        if v == 5 {
            five++
        }

        if v == 10 {
            if five <= 0 {
                return false
            }
            ten++
            five--
        }

        if v == 20 {
            if five > 0 && ten > 0 {
                five--
                ten--
                twenty++
            } else if five >= 3 {
                five -= 3
                twenty++    // 这个不加也没事了,因为没有大于20的需要这个来找零
            } else {
                return false
            }
        }
    }
    return true
}

        咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。

        这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。

        如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。

406. 根据身高重建队列

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第3张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第4张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第5张图片代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第6张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第7张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第8张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第9张图片代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第10张图片

Go 代码如下:

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][0]//这个只是确保身高按照由大到小的顺序来排,并不确定K是按照从小到大排序的
    })
    fmt.Println(people)
    //再按照K进行插入排序,优先插入K小的
    result := make([][]int, 0)

    // 按照k值插入到index=k的地方,index之后的往后移动
	for _, info := range people {
		result = append(result, info)
		copy(result[info[1] +1:], result[info[1]:])//将插入位置之后的元素后移动一位(意思是腾出空间)
		result[info[1]] = info//将插入元素位置插入元素
	}
	return result
}

 452. 用最少数量的箭引爆气球

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第11张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第12张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第13张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第14张图片

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第15张图片

func findMinArrowShots(points [][]int) int {
    var res int = 1//弓箭数
    //先按照第一位排序
    sort.Slice(points,func (i,j int) bool{
        return points[i][0]b{
        return b
    }
    return a
}

代码随想录day35|860. 柠檬水找零|406. 根据身高重建队列| 452. 用最少数量的箭引爆气球|Golang_第16张图片

 

你可能感兴趣的:(代码随想录训练营|算法基础,贪心算法,算法,数据结构,golang,leetcode)