【刷题】LeetCode刷刷刷 — 2021-05-31(2)

简介: 【刷题】LeetCode刷刷刷 — 2021-05-31(2)

一、翻转二叉树


题目描述


翻转一棵二叉树。


示例


示例:
输入:
     4
   /   \
  2     7
 / \   / \
1   3 6   9
输出:
     4
   /   \
  7     2
 / \   / \
9   6 3   1


解题


# 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 invertTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return None
        temp = root.left
        root.left =  root.right
        root.right = temp
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root


典型二叉树反转,使用递归。


利用一个临时结点,使左右结点进行交换。


交换动作完成后,开始递归,左右两边的子树。


二、三个数的最大乘积


题目描述


给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。


示例


示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6


解题


class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        nums.sort()
        max1 = nums[-1]* nums[-2]* nums[-3]
        max2 = nums[0]* nums[1]* nums[-1]
        return max(max1, max2)


如果是一个无序的数组,处理起来没那么快。可以先将数组排序,从小到大。这样一来,3个数的最大乘积

要考虑这几种情况:


  • 数组里都是正数,那么3个数最大乘积就是后3位相乘。
  • 数组里都是负数,那么3个数最大乘积就是后3位相乘。
  • 数组里有正有负,那么3个数最大乘积可能:1.只有1个负数时,仍然为最后3个相乘。2. 大于等于2个负数时,就是最小的2个负数与最大的正数相乘。


所以,总结下来就是2种情况,把两种都计算一遍,然后比较哪个大返回谁。


三、删除有序数组中的重复项


题目描述


给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


示例


示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。
不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。
不需要考虑数组中超出新长度后面的元素。


解题


class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        fast = 1
        slow = 1
        for fast in range(1, len(nums)):
            if nums[fast] != nums[fast-1]:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow


题目重点是要原地删除,用双指针解决,分别是fastslow,初始都指在下标为1的元素。


  • fast为遍历的指针,每遍历一个元素,比较fast与前一个 即fast-1是否相等。
  • 如果不相等,就可以把fast所在的元素,与slow交换,放到前面去。然后slow+=1,指向下一个元素插入
    的位置。
  • 如果相等,说明fast与前一个重复,fast+=1,继续往右遍历,直到下一个不一样的元素,继续放到slow位置。


四、删除排序链表中的重复元素


题目描述


存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。


示例


示例 1:
输入:head = [1,1,2]
输出:[1,2]



1268169-20210601072446162-2048655065.png


示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]


1268169-20210601072521257-2058892369.png


解题


# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return head
        cur = head
        while cur.next:
            if cur.val == cur.next.val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return head


这里是一个升序链表,所以重复的数据是连续排列的。这样,可以一次遍历解决。


  • cur指针指向head结点,开始往下遍历。这里先判断下if not head的情况。
  • 如果cur的值cur.val,与下一个结点的值cur.next.val相等,说明重复,要删除cur.next
    不过这里的删除操作是改变指针指向,cur.next指向cur.next.next即可。被绕开的结点没有引用,会
    被自动回收。
  • 如果不等于,说明不重复,cur = cur.nextcur指针继续往右移动。


五、链表的中间结点


题目描述


给定一个头结点为 head 的非空单链表,返回链表的中间结点。


如果有两个中间结点,则返回第二个中间结点。


示例


示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。


解题


# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        n = 0
        cur = head
        while cur:
            n += 1
            cur = cur.next
        m = 0
        cur = head
        while m < n // 2:
            m += 1
            cur = cur.next
        return cur


两次遍历。


  • 第一次遍历,知道了链表的长度n
  • 第二次遍历,只遍历到n的一半while m < n // 2,返回指针cur
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
17 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
51 3
|
3月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
27 1
|
3月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
30 1
|
3月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
25 1
|
3月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
32 0
【Leetcode刷题Python】73. 矩阵置零
|
3月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
40 0