首页 > 编程语言 >[代码随想录]Day30-贪心算法part04

[代码随想录]Day30-贪心算法part04

时间:2023-08-29 11:57:53浏览次数:49  
标签:10 return people int 随想录 part04 Day30 20

题目:860. 柠檬水找零

思路:

收到钱三种情况:

  1. 5刀:直接收起来就可以了,不需要找钱
  2. 10刀:收到10刀,需要找5刀,如果没有5刀,就返回false,否则5刀-1
  3. 20刀:收到20刀(但是没用,找钱也不能找20所以不需要记录数量),优先考虑找10 5,因为10只能在这里用,其次再考虑找5 5 5

代码:

func lemonadeChange(bills []int) bool {
    f, s := 0, 0 // 代表5 / 10 元数量
    for _, x := range bills {
        if x == 5 { // 收到5直接 f++
            f++
        }else if x == 10 { // 收到10,s++,找钱5 f--
            if f ==  0 { // 无法找钱
                return false
            }
            f--
            s++
        }else if x == 20 { // 收到20
            if s >= 1 && f >= 1 { // 优先考虑找 10 5
                s--
                f--
                continue
            }
            if f >= 3 { // 其次考虑找 5 5 5
                f -= 3
                continue
            }
            return false
        }
    } 
    return true
}

参考:

代码随想录

题目:406. 根据身高重建队列

思路:

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。
对于本题困惑的点是先确定k还是先确定h呢,也就是究竟先按h排序呢,还是先按照k排序呢?如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!
在这个前提下,我们从前往后插入,因为后面的元素比前面的小不会影响到前面元素的k。

代码:

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] // 在按照k由小到大
        }
        return people[i][0] > people[j][0]
    })
    // for i, x := range people { 
    //     for j := i; j > x[1]; j-- { // 等价于下面的copy(但是copy更快一点)
    //         people[j] = people[j-1]
    //     }
    //     people[x[1]] = x
    // }
    for i, p := range people {
		copy(people[p[1]+1 : i+1], people[p[1] : i])  // 空出一个位置
		people[p[1]] = p
	}
    return people
}

参考:

代码随想录

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

思路:

这个就是给定活动时间段,找最多能做多少项活动类似;
直接按照右区间排序,然后最多能做的活动就是不重叠的区间,只需要把这几个区间都能取到,就没问题了。

代码:

func findMinArrowShots(points [][]int) int {
    res := 0
    right := math.MinInt
    sort.Slice(points,func(i,j int)bool {
        return points[i][1] < points[j][1]
    })
    for _, x := range points {
        if x[0] > right {
            right = x[1]
            res++
        }
    }
    return res
}

参考:

代码随想录

标签:10,return,people,int,随想录,part04,Day30,20
From: https://www.cnblogs.com/wtcsky/p/17664366.html

相关文章

  • 代码随想录第6天|242.有效的字母异位词;349.两个数组的交集;202.快乐数;1.两数之和;
     unordered_map<int,int>map;  unordered_set<int>result;vector<vector<int>>res(n,vector<int>(n,0));声明了长度为n*n的二维数组在C++中,auto是一个关键字,用于实现类型推导,使编译器能够根据变量的初始化表达式来自动推断其数据类型。它在C++11标准中引入,......
  • [代码随想录]Day29-贪心算法part03
    题目:1005.K次取反后最大化的数组和思路:思路是:先把负数从小到大变成正数(即绝对值由大到小)如果还需要变化(k>0),就变化最小的数在第一步变化的同时顺便记录一个数组和,那么结束之后会有三种情况:k==0;也就是说负数的个数大于等于k,直接返回结果k%2==0;此时全是正整数,......
  • 代码随想录第4天|链表复习
    做这种算法题真的要放平心态,你想不到思路的时候不要觉得自己太笨,其实想不到很正常,今天环形链表和相交链表这两道题,真的一点思路都没有,环形链表是最难理解的,在课堂上学的链表上的那点东西拿来做这种题确实还是差很多,我真的非常感谢这个做题的训练营,没有它我自己真的做不下去,现在跟......
  • 代码随想录算法训练营第二十四天| 理论基础 77. 组合
     理论基础    卡哥建议:其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。   题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8......
  • 代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜
     669. 修剪二叉搜索树    卡哥建议:这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。   题目链接/文章讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html   视频讲解:https://www.......
  • 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树
      235. 二叉搜索树的最近公共祖先    卡哥建议:相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。   题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%B......
  • 代码随想录第三天|203.移除列表元素;707.设计链表;206.反转链表
    今天最大的收获不是学会了几道题,而是突然改变了自己之前的想法,总想刷一遍就能把题弄回,这样在遇到难题时会拖延很长的时间,备受挫折,做一两道题就再也不想做了,刷题也就终止了应该做好刷三遍题的准备,第一遍,大量看题,看解题思路,在看题的过程中积累知识和解题技巧,不要迷恋在某一道题上,看......
  • [代码随想录]Day27-贪心算法part01
    题目:455.分发饼干思路:贪心,思路是尽量先给胃口值小的分,饼干也是从小的开始分:如果饼干满足了胃口值,结果+1换下一个人,下一个饼干如果饼干满足不了胃口值,换下一个饼干(满足不了胃口值小的一定满足不了大的)代码:funcfindContentChildren(g[]int,s[]int)int{res:=......
  • 代码随想录第二天|977.有序数组的平方;209.长度最小的子数组;59.螺旋矩阵II,总结
    今天的这三道题每道题对我来说都不简单,有序数组的平方和长度最小的子数组这两道题还能用暴力求解,螺旋矩阵看着简单却没有思路,磨了半小时还是决定直接看讲解有序数组平方和用的双指针的思想,代码如下:1classSolution{2public:3vector<int>sortedSquares(vector<int......
  • [代码随想录]Day26-回溯算法part06
    题目:332.重新安排行程思路:其实这里已经是图的部分了,回溯应该也可以。Hierholzer算法解决欧拉问题代码:funcfindItinerary(tickets[][]string)[]string{var(m=map[string][]string{}res[]string)for_,ticket:=rangeticket......