力扣刷题笔记

力扣206 反转链表

题目描述: 给你单链表的头节点head ,请你反转链表,并返回反转后的链表。 

示例 1:

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

示例 2:

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

示例 3:

输入:head = [ ] 输出:[ ]

方法一: 迭代

思路: 遍历链表,在遍历链表的过程中,不断地修改当前节点的指针,使其指向前一个节点,从而实现链表的反转。在修改指针之前,需要提前保存下一个节点的引用,以防止丢失节点。通过遍历完成后,原链表的头节点变成了反转后链表的尾节点,需要返回新的头节点的引用。

python实现代码:

class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution(object):
    def reverseList(self, head):
        """
        反转链表的方法
        
        :type head: ListNode
        :rtype: ListNode
        """ 
        # 初始化前一个节点为 None
        prev = None
        # 初始化当前节点为头节点
        curr = head
        # 遍历链表,直到当前节点为空
        while curr:
            # 存储下一个节点的引用
            next_node = curr.next
            # 将当前节点的指针指向前一个节点,实现反转
            curr.next = prev
            # 更新前一个节点为当前节点
            prev = curr
            # 更新当前节点为下一个节点
            curr = next_node
        # 返回反转后的头节点引用
        return prev

# 主函数用于测试
if __name__ == "__main__":
    # 创建一个链表:1 -> 2 -> 3 -> None
    node3 = ListNode(3)
    node2 = ListNode(2, node3)
    node1 = ListNode(1, node2)

    # 创建 Solution 类的实例
    solution = Solution()
    # 调用 reverseList 方法反转链表
    new_head = solution.reverseList(node1)

    # 打印反转后的链表
    while new_head:
        print(new_head.val, end=" -> ")
        new_head = new_head.next

复杂度分析:

时间复杂度:O(n),其中 nnn 是链表的长度。需要遍历链表一次。

空间复杂度:O(1)。

方法二: 递归

思路:利用递归实现链表的反转。在递归过程中,我们假设递归函数能够正确地反转从当前节点的下一个节点开始的链表部分,然后我们将当前节点的下一个节点指向当前节点,从而完成链表的反转操作。

python实现代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        # 如果链表为空或者只有一个节点,则直接返回头节点
        if not head or not head.next:
            return head
        
        # 递归调用,反转以当前节点的下一个节点为头节点的子链表
        new_head = self.reverseList(head.next)
        
        # 将当前节点的下一个节点的下一个节点指向当前节点,完成反转操作
        head.next.next = head
        
        # 将当前节点的下一个节点设为 None,防止产生环
        head.next = None
        
        # 返回反转后的头节点
        return new_head

# 主函数用于测试
if __name__ == "__main__":
    # 创建一个链表:1 -> 2 -> 3 -> None
    node3 = ListNode(3)
    node2 = ListNode(2, node3)
    node1 = ListNode(1, node2)

    # 创建 Solution 类的实例
    solution = Solution()
    # 调用 reverseList 方法反转链表
    new_head = solution.reverseList(node1)

    # 打印反转后的链表
    while new_head:
        print(new_head.val, end=" -> ")
        new_head = new_head.next

复杂度分析:

时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。

空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。

力扣204 计数质数

题目描述:给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

示例 1:

输入:n = 10

输出:4

解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

示例 2:

输入:n = 0

输出:0

示例 3:

输入:n = 1

输出:0

方法一:埃氏筛

思路:利用布尔数组标记质数,从 2 开始遍历至 n 的平方根,将每个质数的倍数标记为非质数,最后统计布尔数组中值为 True 的数量即为小于 n 的质数的数量。

python实现代码:

class Solution:
    def countPrimes(self, n: int) -> int:
        if n <= 2:
            return 0
        
        # 初始化布尔数组,全部标记为 True,表示所有数都是质数
        primes = [True] * n
        # 0 和 1 不是质数,将其标记为 False
        primes[0], primes[1] = False, False
        
        # 从 2 开始遍历到 n 的平方根
        for i in range(2, int(n ** 0.5) + 1):
            if primes[i]:
                # 将 i 的所有倍数标记为非质数
                primes[i*i:n:i] = [False] * len(primes[i*i:n:i])
        
        # 统计布尔数组中值为 True 的数量,即为小于 n 的质数的数量
        return sum(primes)

# 测试代码
if __name__ == "__main__":
    solution = Solution()
    n = 10
    print(solution.countPrimes(n))  # 输出结果应为 4,因为小于 10 的质数有 2、3、5、7

复杂度分析:

时间复杂度:O(n * log(log(n)))。算法中最主要的部分是埃拉托斯特尼筛法的实现,其中有一个嵌套循环,外部循环从 2 到 n 的平方根,内部循环从当前质数的平方开始,直到 n,所以时间复杂度为 O(n * log(log(n)))。

空间复杂度:O(n)。需要使用一个大小为 n 的布尔数组 primes 来标记质数,因此空间复杂度为 O(n)。

力扣238 除自身以外数组的乘积

题目描述:给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]

输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]

输出: [0,0,9,0,0]

方法一:左右乘积列表

思路:使用两个数组来保存每个元素左侧和右侧的乘积。具体思路如下:

  1. 初始化两个数组 left_products 和 right_products,分别用于保存每个元素左侧和右侧的乘积。
  2. 遍历原始数组 nums,计算每个元素左侧所有元素的乘积,并存储在 left_products 中。
  3. 遍历原始数组 nums(从右向左遍历),计算每个元素右侧所有元素的乘积,并存储在 right_products 中。
  4. 对于结果数组 answer,每个元素的值等于对应位置的左侧乘积和右侧乘积的乘积。
  5. 返回结果数组 answer。

python实现代码:

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        lens = len(nums)
        answer = [1] * lens
        
        # 计算每个元素左侧所有元素的乘积
        left_product = 1
        for i in range(lens):
            answer[i] *= left_product
            left_product *= nums[i]
        
        # 计算每个元素右侧所有元素的乘积,并与左侧乘积相乘得到最终结果
        right_product = 1
        for i in range(lens - 1, -1, -1):
            answer[i] *= right_product
            right_product *= nums[i]
        
        return answer

复杂度分析:

时间复杂度:O(n),其中 n 是输入数组 nums 的长度。在算法中,我们只需要遍历 nums 数组两次,一次从左到右,一次从右到左,每次遍历都需要 O(n) 的时间。因此,总的时间复杂度是 O(n)。

空间复杂度:O(1),除了返回的答案之外,我们只使用了常数额外的空间来存储一些变量,例如左侧乘积和右侧乘积。因此,空间复杂度是 O(1)。

持续更新中.............

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/426565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音视频评论批量下载软件|抖音数据抓取工具

随着业务需求的增长&#xff0c;抖音视频的下载需求也日益增加。传统的方式是通过逐个复制粘贴分享链接来下载视频&#xff0c;这种操作效率低下且耗时费力。为了解决这一问题&#xff0c;我们开发了一款基于C#的抖音视频评论批量下载软件&#xff0c;旨在实现通过关键词自动批…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

【大厂AI课学习笔记NO.64】机器学习开发框架

机器学习开发框架本质上是一种编程库或工具&#xff0c;目的是能够让开发人员更容易、更快速地构建机器学习模型。 机器学习开发框架封装了大量的可重用代码&#xff0c;可以直接调用&#xff0c;目的是避免“重复造轮子’大幅降低开发人员的开发难度&#xff0c;提高开发效率…

Spark(2)-基础tranform算子(一)

一、算子列表 编号名称1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

计算机网络-网络安全(一)

1.网络安全威胁和漏洞类型&#xff1a; 窃听 假冒 重放 流量分析 破环完整 病毒 木马 诽谤 非授权访问 拒绝服务 漏洞&#xff1a;物理、软件、不兼容、其他等。 2.网络安全信息数据五大特征&#xff1a; 完整性&…

kettle下载及安装

JDK下载 安装kettle之前需要安装JDK JDK下载链接&#xff1a;JDK下载 配置环境变量&#xff1a; 新建系统变量&#xff1a;变量值为JDK安装路径 Path新增&#xff1a; kettle下载 链接地址&#xff1a;PDI&#xff08;kettle&#xff09; 点击下载 同意 Click here to a…

模拟集成电路设计:Bandgap电路设计及版图实现

模拟集成电路设计 Bandgap电路设计及版图实现 一、目的&#xff1a; 1、熟悉模拟集成电路设计的基本流程&#xff0c;实现Bandgap电路设计&#xff1b; 2、熟悉Linux系统及Cadence Virtuoso icfb设计、仿真软件的使用方法。 二、原理&#xff1a; 1、设计目标&#xff1a;…

Vmware esxi虚拟主机状态无效,无法注销重启等操作修复解决

问题 装有ESXI系统的服务器在强制关机启动后&#xff0c;显示虚拟机状态是无效的&#xff0c;并且无法进行任何操作。 解决办法 对出问题的虚拟机重新注册 1、开启esxi系统的ssh功能 2、取消注册出问题的虚拟机 找到问题的虚拟机 [rootlocalhost:~] vim-cmd vmsvc/getal…

基于JavaWeb实现的药店管理系统

一、系统架构 前端&#xff1a;jsp | layui | jquery | css 后端&#xff1a;spring | springmvn | mybatis 环境&#xff1a;jdk1.8 | mysql 二、代码及数据库 三、功能介绍 01. 登录 02. 首页 03. 药品管理 04. 销售管理-销售记录管理 05. 销售管理-退…

AI蠕虫病毒威胁升级,揭示AI安全新危机

一组研究人员成功研发出首个能够通过电子邮件客户端窃取数据、传播恶意软件以及向他人发送垃圾邮件的AI蠕虫&#xff0c;并在使用流行的大规模语言模型&#xff08;LLMs&#xff09;的测试环境中展示了其按设计功能运作的能力。基于他们的研究成果&#xff0c;研究人员向生成式…

Unreal触屏和鼠标控制旋转冲突问题

Unreal触屏和鼠标控制旋转冲突问题 鼠标控制摄像机旋转添加Input轴计算旋转角度通过轴事件控制旋转 问题和原因问题原因 解决办法增加触摸控制旋转代码触屏操作下屏蔽鼠标轴响应事件 鼠标控制摄像机旋转 通过Mouse X和Mouse Y控制摄像机旋转。 添加Input轴 计算旋转角度 通过…

Python推导式大全与实战:精通列表、字典、集合和生成器推导式【第115篇—python:推导式】

Python推导式大全与实战&#xff1a;精通列表、字典、集合和生成器推导式 Python语言以其简洁、优雅的语法而闻名&#xff0c;其中推导式是其独特之处之一。推导式是一种在一行代码中构建数据结构的强大方式&#xff0c;它涵盖了列表、字典、集合和生成器。本篇博客将全面介绍…

Python实现BIAS工具判断信号:股票技术分析的工具系列(4)

Python实现BIAS工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;4&#xff09; 介绍算法解释 代码rolling函数介绍完整代码data代码BIAS.py 介绍 在股票技术分析中&#xff0c;BIAS&#xff08;乖离率&#xff09;是一种常用的技术指标&#xff0c;用于判断股票价…

sparse transformer 常见稀疏注意力

参考&#xff1a; https://zhuanlan.zhihu.com/p/259591644 主要就是降低transformer自注意力模块的复杂度 复杂度主要就是 Q K^T影响的&#xff0c;稀疏注意力就是在Q点乘K的转置这模块做文章 下列式一些sparse transformer稀疏注意力方法 a、transformer原始的 &#xff0…

文献阅读:The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

文献阅读&#xff1a;The Unreasonable Effectiveness of Easy Training Data for Hard Tasks 1. 文章简介2. 方法介绍 1. 数据集难易度分析2. 模型训练前后变化 3. 实验考察 & 结论 1. 实验设计 1. 使用数据集2. 使用模型 2. 实验结果 1. 数据集难度分析2. 在Easy数据集下…

Excel MATCH函数 两张顺序不同表格,统一排序

目录 一. 背景二. 添加辅助列,使用MATCH函数生成排序条件三. 效果 一. 背景 有如下图所示的两张表格&#xff0c;分别记录着同一批人的1月份和2月份的工资。表格A和表格B中的姓名列相同&#xff0c;工资列数据不同现在要求参考表格A中的姓名列对表格B中的数据进行排序&#xf…

2024.3.1

1.TCP机械臂测试 代码&#xff1a; #include <myhead.h>#define SER_IP "192.168.43.185" //服务器ip #define SER_PORT 8888 //服务器端口号#define CLI_IP "192.168.153.128" //客户端IP #define CLI_PORT 9999 //客户端端口号…

使用AC自动机实现敏感词过滤(java)

主要分成2部分 trie树的构建&#xff08;前缀树&#xff0c;字典树&#xff09;fail指针的构建 1. trie 树 同一层级不会有重复的字符敏感词的最后一个字符会标记&#xff0c;并携带敏感词的长度 2. fail 指针的构建 fail 指针是指在某个分支匹配失败后&#xff0c;重新…

碰撞的小球(Colliding balls)

效果如下&#xff1a; 代码: #include <bits/stdc.h> #include <graphics.h>//必须库 #include <time.h> using namespace std; int main() {initgraph(650,400);//背景图大小circle(100,100,40);fillcircle(200,200,10);//球的数据srand(time(NULL));int …

Leetcoder Day37| 动态规划part04 背包问题

01背包理论基础 面试掌握01背包&#xff0c;完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…