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