力扣刷题之旅:启程篇(三)

本文介绍了力扣(LeetCode)上的一些入门编程题目,包括二叉树的镜像、反转二叉树、合并有序数组、删除链表重复元素和寻找旋转排序数组最小值。解题涉及递归、哈希表和二分查找等算法,旨在提升编程技能和算法思维。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。  

​​​​​​​

--点击进入刷题地址 


1.二叉树的镜像

题目描述:

  • 编写一个函数,输入一个二叉树,输出该二叉树的镜像。

解题思路:

  • 遍历二叉树,对于每个节点,将其左右子节点互换,即可得到镜像二叉树。 

代码示例:

class TreeNode:  
    def __init__(self, val=0, left=None, right=None):  
        self.val = val  
        self.left = left  
        self.right = right  
  
def mirror_tree(root):  
    if not root:  
        return None  
    root.left, root.right = mirror_tree(root.right), mirror_tree(root.left)  
    return root

2.反转二叉树

题目描述:

  • 给定一个二叉树的根节点 root,将其每个节点的左右子节点反转。

解题思路:

  • 递归遍历二叉树,对于每个节点,将其左右子节点互换即可。

代码示例: 

class TreeNode:  
    def __init__(self, val=0, left=None, right=None):  
        self.val = val  
        self.left = left  
        self.right = right  
  
def invert_tree(root):  
    if not root:  
        return None  
    root.left, root.right = invert_tree(root.right), invert_tree(root.left)  
    return root

3.合并两个有序数组

题目描述:

  • 给定两个按非递减顺序排列的整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 nums1 成为一个按非递减顺序排列的数组。

解题思路:

  • 遍历两个数组,依次比较对应的元素,将较小的元素加入结果数组中,并更新指针

代码示例: 

def merge(nums1, nums2):  
    i, j = 0, 0  
    result = []  
    while i < len(nums1) and j < len(nums2):  
        if nums1[i] <= nums2[j]:  
            result.append(nums1[i])  
            i += 1  
        else:  
            result.append(nums2[j])  
            j += 1  
    result += nums1[i:]  
    result += nums2[j:]  
    return result

4.删除链表中重复元素

题目描述:

  • 给定一个链表,删除所有重复的元素,使每个元素只出现一次。

解题思路:

  • 遍历链表,使用哈希表存储已遍历的元素。对于每个节点,检查其值是否已存在于哈希表中,如果存在则删除该节点,否则将其加入哈希表中。

代码示例: 

class ListNode:  
    def __init__(self, val=0, next=None):  
        self.val = val  
        self.next = next  
  
def delete_duplicates(head):  
    if not head:  
        return None  
    visited = set()  # 使用哈希表存储已遍历的元素值  
    dummy = ListNode(0)  # 虚拟头节点,方便处理边界情况  
    curr = dummy  # 当前节点指针,初始指向虚拟头节点  
    while head:  
        if head.val not in visited:  # 如果当前元素值未出现过,则加入结果链表,并更新已遍历集合和指针位置  
            visited.add(head.val)  
            curr.next = ListNode(head.val)  # 创建新节点并加入结果链表末尾  
            curr = curr.next  # 移动指针位置,指向新节点,准备处理下一个元素值  
        head = head.next  # 继续遍历下一个节点,避免重复处理相同元素值导致死循环问题出现  
    return dummy.next  # 返回结果链表的头节点,不包括虚拟头节点,避免返回虚拟头节点导致出现边界问题

5.寻找旋转排序数组中的最小值

题目描述:

  • 给定一个旋转排序数组 nums(可能包含重复元素),找到其中的最小元素。

解题思路:

  • 使用二分查找算法,分别在数组的左半部分和右半部分查找最小值。如果左半部分的最小值大于右半部分的最大值,则最小值一定在右半部分;否则最小值一定在左半部分。在选定部分继续使用二分查找,直到找到最小值为止。

代码示例: 

def find_min(nums):  
    left, right = 0, len(nums) - 1  
    while left < right:  
        pivot = (left + right) // 2  
        if nums[pivot] > nums[right]:  # 左半部分有序,最小值在右半部分  
            left = pivot + 1  
        else:  # 右半部分有序,最小值在左半部分或就是当前中间节点值本身  
            right = pivot  
    return nums[left]

小结:

        解决这些题目需要运用不同的算法和数据结构知识,如递归、哈希表、二分查找等。在解题过程中,需要注意边界情况和细节处理,如链表的虚拟头节点处理、数组的旋转排序特性等。通过这些题目的练习,可以提升读者的编程能力和算法思维,为解决更复杂的问题打下基础。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高菘菘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值