TLP-Task09学习笔记

这篇博客介绍了如何使用Python解决LeetCode中的三道算法题:合并两个有序数组、生成格雷编码以及计算二叉树的最大深度。文章提供了详细的思路解析和代码实现,包括双指针法、位操作符在格雷编码中的应用以及递归求解二叉树深度。同时,文章还补充了位操作符的相关知识。


本篇为Datawhale组队学习计划第21期LeetCode精选题目组Task09学习笔记。
初学,时间有点仓促,很多解法没有详细分析,未来可能会修改,见谅。
Datawhale学习文档:
https://github.com/datawhalechina/team-learning-program/tree/master/LeetCodeTencent

088 合并两个有序数组

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

思路

参考官方题解(评论区第一条戳中笑点hhh)
看到有序,那就二分法,考虑双指针法,在不确定中试探比较大小。注意题目要求合并到nums1中。
指针分别放在nums1和nums2数组开头,比较最小值后将其放入输出数组中。
官解的图:
优化前优化:若数组从开头开始修改,为避免影响后续数据,nums1的数据需要提前存放(也就相当于新建了一个数组)。改为直接从末尾修改,节省一些空间。
优化后

Python实现

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1 = m - 1      # p1,p2分别指向两个数组的末尾
        p2 = n - 1
        p = m + n - 1   # 从末尾开始从小到大填入元素
        
        while p1 >= 0 and p2 >= 0:
            if nums1[p1] < nums2[p2]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] =  nums1[p1]
                p1 -= 1
            p -= 1

        nums1[:p2 + 1] = nums2[:p2 + 1]	# 合并
        

089 格雷编码

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gray-code

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种
格雷编码序列必须以 0 开头。

示例:

输入: 2
输出: [0,1,3,2]

输入: 0
输出: [0]

解释:
00 - 0
01 - 1
11 - 3
10 - 2
对于给定的 n,其格雷编码序列并不唯一
例如,[0,2,3,1] 也是一个有效的格雷编码序列。
00 - 0
10 - 2
11 - 3
01 - 1

此外我们定义格雷编码序列必须以 0 开头
给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。
因此,当 n = 0 时,其格雷编码序列为 [0]。

思路

Python实现

(代码比较麻烦但是个人觉得蛮好理解,位操作符知识见文末)

class Solution:
    def grayCode(self, n: int) -> List[int]:
        res = []
        size = 1 << n   # 位运算符,二进制下,从右侧推入零来推动最左边的位。
        for i in range(size):
            res.append((i >> 1) ^ i)
        return res
        

104 二叉树的最大深度

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7

返回它的最大深度 3 。

思路

官方题解给出递归与广度优先搜索两种方法(其实还有深度优先等等)。

Python实现

递归比较简单(代码开头给出了二叉树的定义)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if root is None: 
            return 0 
        else: 
            left_height = self.maxDepth(root.left) 
            right_height = self.maxDepth(root.right) 
            return max(left_height, right_height) + 1 

补充知识

位操作符

https://www.runoob.com/python/python-operators.html
https://www.w3school.com.cn/python/python_operators.asp
<<
左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。
如a=60,二进制0011 1100
a << 2 输出结果 240 ,二进制解释: 1111 0000
<<=
赋值运算符,x<<=3,即为x=x<<3

利用这两个算符可以比较方便地进行二进制计算。如本文代码中size=1<<n,若n=4,左移4位,从1到了10000,就是16(高位丢弃,低位补0)

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值