• 算法day32|122,55,45


    122.买卖股票的最佳时机II

    1. class Solution:
    2. def maxProfit(self, prices: List[int]) -> int:
    3. profit = 0
    4. for i in range(len(prices)-1):
    5. diff = prices[i+1]-prices[i]
    6. if diff > 0:
    7. profit += diff
    8. else:
    9. profit += 0
    10. return profit

    简单到我不敢相信。

    本题解法很巧妙,大家可以看题思考一下,在看题解。

    局部最优:收集每天的正利润,全局最优:求得最大利润

    局部最优可以推出全局最优,找不出反例,试一试贪心!

    题解

    1. class Solution:
    2. def maxProfit(self, prices: List[int]) -> int:
    3. result = 0
    4. for i in range(1, len(prices)):
    5. result += max(prices[i] - prices[i - 1], 0)
    6. return result

    代码随想录

    二刷:(未ac)

    1. var maxProfit = function(prices) {
    2. let result = 0
    3. for(let i = 1;i<prices.length;i++){
    4. result += Math.max(prices[i]-prices[i-1],0)
    5. }
    6. return result
    7. };

    55. 跳跃游戏

    那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

    每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

    贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

    1. class Solution:
    2. def canJump(self, nums: List[int]) -> bool:
    3. cover = 0
    4. #如果nums里面只有一个数,总是能到达终点的
    5. if len(nums) == 1:return True
    6. i = 0
    7. while i <= cover:
    8. cover = max(i+nums[i],cover)
    9. if cover >= len(nums)-1:
    10. return True
    11. i += 1
    12. return False

    还挺难理解的,就是说,局部最优,每次都走最大的。看这个图。一切就明白了 

    代码随想录

    js:(未ac)

    1. var canJump = function(nums) {
    2. let cover = 0
    3. if(nums.length === 1) return true
    4. //i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。
    5. for(let i = 0;i<= cover;i++){
    6. cover = Math.max(nums[i]+i,cover)
    7. if(cover >= nums.length-1){return true}
    8. }
    9. return false
    10. };

    45.跳跃游戏II

    1. class Solution:
    2. def jump(self, nums: List[int]) -> int:
    3. curdistance = 0
    4. count = 0
    5. nextdistance = 0
    6. for i in range(len(nums)):
    7. nextdistance = max(i+nums[i],nextdistance)
    8. if i == curdistance:
    9. if curdistance !=len(nums)-1:
    10. count +=1
    11. curdistance = nextdistance
    12. if nextdistance >=len(nums)-1:
    13. break
    14. else:
    15. break
    16. return count

    好难理解,我不太能理解反正就是。。。

    1. class Solution:
    2. def jump(self, nums: List[int]) -> int:
    3. curdistance = 0
    4. count = 0
    5. nextdistance = 0
    6. for i in range(len(nums)-1):
    7. nextdistance = max(i+nums[i],nextdistance)
    8. if i == curdistance:
    9. curdistance = nextdistance
    10. count +=1
    11. return count

    二刷(确实很难理解)

    需要知道我们使用贪心算法,所以我们贪心的是少步数

    局部最优:找步数最少,如果它已经走到了最大范围,但是还没有到达结果,只能多加一步,只能更新下一步,没有办法了,最优了,步数最少了。

    然后这时候更新一下下一步最大范围,如果下一步最大范围已经到达终点,直接跳出循环

    1. var jump = function(nums) {
    2. let current = 0
    3. let next = 0
    4. let count = 0
    5. for(let i = 0;i<nums.length;i++){
    6. next = Math.max(nums[i]+i,next)
    7. if(i === current){
    8. if(current < nums.length-1){
    9. count ++
    10. current = next
    11. if(next >= nums.length-1){
    12. break
    13. }
    14. }else break
    15. }
    16. }
    17. return count
    18. };

    复习

    203.移除链表元素

    细节错误:

    忘记创建虚拟头节点

    然后需要遍历到最后一个元素的前一个元素

    然后还需要判断head是否为空,如果为空的话,就return一个空值

    1. class Solution:
    2. def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
    3. #循环这个链表
    4. if head is None:
    5. return
    6. dummy = ListNode(0)
    7. dummy.next = head
    8. cur = dummy
    9. #这个细节有问题
    10. while cur.next is not None:
    11. if cur.next.val == val:
    12. cur.next = cur.next.next
    13. #这个细节有问题
    14. else:
    15. cur = cur.next
    16. return dummy.next

     707. Design Linked List

    插入节点的时候,记得创建temp变量来存储对应的节点

    还有需要记得index 会不会溢出

    1. class ListNode(object):
    2. def __init__(self,val):
    3. self.val = val
    4. self.next = None
    5. class MyLinkedList(object):
    6. def __init__(self):
    7. self.dummy_head = ListNode(0)
    8. self.size = 0
    9. def get(self, index):
    10. """
    11. :type index: int
    12. :rtype: int
    13. """
    14. #注意
    15. if index <0 or index >= self.size :
    16. return -1
    17. cur = self.dummy_head
    18. for i in range(index+1):
    19. cur = cur.next
    20. return cur.val
    21. def addAtHead(self, val):
    22. """
    23. :type val: int
    24. :rtype: None
    25. """
    26. self.addAtIndex(0,val)
    27. def addAtTail(self, val):
    28. """
    29. :type val: int
    30. :rtype: None
    31. """
    32. self.addAtIndex(self.size,val)
    33. def addAtIndex(self, index, val):
    34. """
    35. :type index: int
    36. :type val: int
    37. :rtype: None
    38. """
    39. #注意
    40. if index > self.size:
    41. return
    42. cur = self.dummy_head
    43. newNode = ListNode(val)
    44. for i in range(index):
    45. cur = cur.next
    46. temp = cur.next
    47. cur.next = newNode
    48. newNode.next = temp
    49. self.size += 1
    50. def deleteAtIndex(self, index):
    51. """
    52. :type index: int
    53. :rtype: None
    54. """
    55. #注意
    56. if index < 0 or index >= self.size:
    57. return
    58. cur = self.dummy_head
    59. for i in range(index):
    60. cur = cur.next
    61. cur.next = cur.next.next
    62. self.size -=1

    206.反转链表

    还比较简单,记得起来怎么写

    1. class Solution:
    2. def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
    3. dummy = None
    4. cur = head
    5. pre = dummy
    6. while cur is not None:
    7. temp = cur.next
    8. cur.next = pre
    9. pre = cur
    10. cur = temp
    11. return pre

  • 相关阅读:
    整个自动驾驶小车001:概述
    Linux虚拟机怎么连接串口?
    32、HyperNeRF
    Java急速转职GoLang工程师资料
    11 结构型模式- 代理模式
    口令安全是什么意思?等保2.0政策中口令安全标准条款有哪些?
    浅谈基于PLC和Modbus的配电室现场环境监控系统设计及产品选型
    【每日一题】50. Pow(x, n)
    Ikigai: 享受生命的意义
    软件开发三大痛点!小程序容器如何解决?
  • 原文地址:https://blog.csdn.net/weixin_42173016/article/details/128053807