• 算法day35|860,406,452


    目录

    860.柠檬水找零

    406.根据身高重建队列

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


    860.柠檬水找零

    1. class Solution:
    2. def lemonadeChange(self, bills: List[int]) -> bool:
    3. five,ten,twenty = 0,0,0
    4. for bill in bills:
    5. #情况一:如果bills是5元,不需要找零
    6. if bill == 5:
    7. five += 1
    8. #情况二:如果bills是10元,找5元
    9. elif bill == 10:
    10. if five >= 1:
    11. five -= 1
    12. ten += 1
    13. else:
    14. return False
    15. #情况三,如果bills是20元,找10元,找5元,贪心算法,先花大的,再画小的
    16. else:
    17. if ten >0 and five >0:
    18. twenty += 1
    19. ten -= 1
    20. five -= 1
    21. elif five >2:
    22. five -=3
    23. else:
    24. return False
    25. return True

    看起来还挺难的,只需要知道三个逻辑。

    1.如果是5块,不需要找

    2.如果是10块,找5

    3.如果是20块,找5和10.

    本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。

    代码随想录

    二刷:(未ac)

    1. var lemonadeChange = function(bills) {
    2. // 统计一下都有多少张纸币
    3. let five = 0
    4. let ten = 0
    5. let twenty = 0
    6. for(let i = 0;i<bills.length;i++){
    7. if(bills[i] === 5){
    8. five ++
    9. }
    10. if(bills[i] === 10){
    11. if(five >0){
    12. five --
    13. ten ++
    14. }else{
    15. return false
    16. }
    17. }
    18. if(bills[i] === 20){
    19. if(ten >= 1 && five >=1){
    20. five --
    21. ten --
    22. twenty ++
    23. }else if (five >=3){
    24. five = five -3
    25. twenty ++
    26. }else{
    27. return false
    28. }
    29. }
    30. }
    31. return true
    32. };

    406.根据身高重建队列

    大概逻辑,就是分为两个维度,第一个维度是根据height排序,第二个维度是根据k(前面有几个人)排序。

    1. class Solution:
    2. def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
    3. #根据height排序
    4. people.sort(key=lambda x: (-x[0], x[1]))
    5. result = []
    6. #二个维度来判断,第一个为height,第二个为k
    7. #遍历people数组,看第二位,如果下标是什么,就插入什么
    8. for p in people:
    9. result.insert(p[1], p)
    10. return result

    那么这个lamba key到底是怎么排序的呢?

    sort是从小到大排序。

    insert这个库函数需要记得 

    insert()方法在指定位置插入指定值。

    代码随想录

    二刷(未ac)

    需要使用两个维度。

    控制第一个维度先,先将数组根据身高从大到小排序。身高相同的话根据k值从小到大排序

    再控制第二个维度,根据k值进行插入

    1. var reconstructQueue = function(people) {
    2. let result = []
    3. people.sort((a,b)=>{
    4. if(b[0]!=a[0]){
    5. return b[0]-a[0]
    6. }else{
    7. return a[1]-b[1]
    8. }
    9. })
    10. for(let i = 0;i<people.length;i++){
    11. result.splice(people[i][1],0,people[i])
    12. }
    13. return result
    14. };

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

    题目好长,有点难理解。

    大概就是说,假设弓箭为8,区间为[1,10],这才能射穿这个气球。如果是11,就不行,问,那么多区间,最少需要多少个箭射穿它。

    所以说,我们需要找重复区间,像找个样子

    重叠的最小边界,需要一个箭。气球三的边界因为大于最小边界,所以需要一个新的箭

    1. class Solution:
    2. def findMinArrowShots(self, points: List[List[int]]) -> int:
    3. if len(points) == 0:return 0
    4. result = 1
    5. #排序,根据第一个排,一样的话根据第二个排
    6. points.sort(key=lambda x:x[0])
    7. #遍历每一个区间,如果区间的数相邻,那么就可以不算一个结果。如果不相邻,那么算一个结果
    8. for i in range(1,len(points)):
    9. if points[i-1][1]0]:
    10. result +=1
    11. else:
    12. points[i][1] = min(points[i-1][1],points[i][1])
    13. print(points[i][1])
    14. return result

    代码随想录

    二刷:(未ac)

    我开始想题的时候,确实也先将区间从小到大排序了。

    然后也知道重叠的部分需要使用一个弓箭。但是这个想法就直接,所以错了。

    反过来想,如果不重叠那必须需要一个弓箭给它啊。

    如果重叠了,更新一下最小边界。如果下一个不在最小边界的范围内,说明需要新的一个弓箭

    1. var findMinArrowShots = function(points) {
    2. let result = 1
    3. // 根据最小区间进行排序从小到大,相同就根据第二个区间
    4. points.sort((a,b)=>{
    5. if(a[0]!==b[0]){
    6. return a[0]-b[0]
    7. }else{
    8. return a[1]-b[1]
    9. }
    10. })
    11. for(let i = 1;i<points.length;i++){
    12. if(points[i-1][1] < points[i][0]){
    13. result++;
    14. }else{
    15. points[i][1] = Math.min(points[i-1][1],points[i][1])
    16. }
    17. }
    18. return result
    19. };

    复习

    今日任务

    • 24. 两两交换链表中的节点
    • 19.删除链表的倒数第N个节点
    • 面试题 02.07. 链表相交
    • 142.环形链表II
    • 总结

    详细布置

    24. 两两交换链表中的节点

    1. class Solution:
    2. def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
    3. dummy = ListNode(0)
    4. dummy.next = head
    5. cur = dummy
    6. while cur.next is not None and cur.next.next is not None:
    7. temp = cur.next
    8. temp1 = cur.next.next.next
    9. cur.next = cur.next.next
    10. #因为断掉了
    11. cur.next.next = temp
    12. temp.next = temp1
    13. cur = cur.next.next
    14. return dummy.next

    写了20分钟,还是狠不扎实。

    步骤问题。到底哪一个是步骤1,步骤2,步骤3,画图是画对了

    终止条件写的不对,到底到什么时候停止不确定。

    题目链接/文章讲解/视频讲解: 代码随想录

    19.删除链表的倒数第N个节点

    1. class Solution:
    2. def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
    3. dummy = ListNode(0)
    4. dummy.next = head
    5. slow = dummy
    6. fast = dummy
    7. for i in range(n):
    8. fast = fast.next
    9. while fast.next is not None:
    10. slow = slow.next
    11. fast = fast.next
    12. slow.next = slow.next.next
    13. return dummy.next

    使用双指针

    slow,fast,先移动fast指针一直到倒数第二个。

    然后同时移动slow和fast,直到fast 为空的时候。停止移动。然后直接将slow.next == slow.next.next为

    题目链接/文章讲解/视频讲解:代码随想录

    面试题 02.07. 链表相交

    思路就是,先计算他们的差值。

    然后移动到他们相同位置的位置,,之后查找是不是相同。如果相同返回节点,不相同返回空。

    1. class Solution:
    2. def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
    3. lenA,lenB = 0,0
    4. curA = headA
    5. curB = headB
    6. while curA:
    7. curA = curA.next
    8. lenA += 1
    9. while curB:
    10. curB = curB.next
    11. lenB += 1
    12. curA = headA
    13. curB = headB
    14. #寻找
    15. def find(headA,headB):
    16. while headA != headB:
    17. headA = headA.next
    18. headB = headB.next
    19. if headA is not None:
    20. return headA
    21. else:
    22. return
    23. if lenA > lenB:
    24. diff = lenA-lenB
    25. for i in range(diff):
    26. curA = curA.next
    27. return find(curA,curB)
    28. elif lenB > lenA:
    29. diff = lenB -lenA
    30. for i in range(diff):
    31. curB = curB.next
    32. return find(curA,curB)
    33. else:
    34. return find(curA,curB)

    题目链接/文章讲解:代码随想录

    142.环形链表II

    算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。

    题目链接/文章讲解/视频讲解:代码随想录

  • 相关阅读:
    HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化
    冰蝎工具开发实现动态二进制加密WebShell
    TIJ14_类型信息
    【MATLAB】史上最全的5种数据插值算法全家桶
    数据建模之查文献找数据以及数据预处理
    SpringCore完整学习教程5,入门级别
    python PIL基本使用
    《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿
    蓝牙核心规范(V5.4)10.10-BLE 入门笔记之SMP和安全性
    Python PyTorch 获取 MNIST 数据
  • 原文地址:https://blog.csdn.net/weixin_42173016/article/details/128090657