力扣刷题笔记

力扣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 = valself.next = nextclass Solution(object):def reverseList(self, head):"""反转链表的方法:type head: ListNode:rtype: ListNode""" # 初始化前一个节点为 Noneprev = 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 -> Nonenode3 = 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 = valself.next = nextclass 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 -> Nonenode3 = 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 不是质数,将其标记为 Falseprimes[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 = 10print(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 = 1for i in range(lens):answer[i] *= left_productleft_product *= nums[i]# 计算每个元素右侧所有元素的乘积,并与左侧乘积相乘得到最终结果right_product = 1for i in range(lens - 1, -1, -1):answer[i] *= right_productright_product *= nums[i]return answer

复杂度分析:

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合MyBatis实现增删改查

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容: SpringBoot整合MyBatis实现增删改查 📚个人知识库: Leo知识库,欢迎大家访…

【大厂AI课学习笔记NO.61】环境部署的选择

主要是选择单机和分布式、生产和开发环境的规划等。 开发环境、测试环境、预发布环境和生产环境是软件开发和部署过程中常见的几个环境&#xff0c;它们各自的定义、区别、联系以及实现的关键技术如下&#xff1a; 1. 开发环境&#xff08;Development Environment&#xff09…

12.vue学习笔记(异步组件+依赖注入+Vue应用)

文章目录 1.异步组件2.依赖注入注意事项 3.Vue应用3.1.应用实例3.2.根组件3.3.挂载应用3.4.公共资源文件夹 1.异步组件 目的&#xff1a;优化组件性能 在大型项目中&#xff0c;我们可能需要拆分应用为更小的块&#xff0c;并仅在需要时再从服务器加载相关组件 defineAsyncCom…

Chat GPT:AI聊天机器人的革命性突破!

一、引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;其中最具代表性的成果之一便是Chat GPT。这款基于自然语言处理&#xff08;NLP&#xff09;技术的聊天机器人&#xff0c;以其高度智能、灵活多变的特点&#xff0c;迅速吸引了全…

机器学习-面经

经历了2023年的秋招&#xff0c;现在也已经入职半年了&#xff0c;空闲时间将面试中可能遇到的机器学习问题整理了一下&#xff0c;可能答案也会有错误的&#xff0c;希望大家能指出&#xff01;另外&#xff0c;不论是实习&#xff0c;还是校招&#xff0c;都祝福大家能够拿到…

如何使用恢复软件恢复删除的文件?回收站文件恢复攻略

随着计算机在日常生活中的普及&#xff0c;文件的管理和存储成为我们不可或缺的技能。在Windows操作系统中&#xff0c;回收站作为一个帮助我们管理文件删除的重要工具&#xff0c;在误删了一些重要文件之后&#xff0c;我们可能会因为找不到回收站中恢复的文件而感到困惑。本文…

网络编程难点之select、poll与epoll详解

前言 为什么需要I/O多路复用技术&#xff1f; 首先&#xff0c;I/O多路复用技术主要被应用在需要高性能的网络服务器程序中。 高性能网络服务器程序需要做的事情就是供多个客户端同时进行连接并处理客户端传送过来的数据请求&#xff1a; 对于这种情况&#xff0c;很多人自然…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块&#xff0c;最初由AQR Capital Management于2008年4月开发&#xff0c;并于2009年底开源。Pandas的名称来源于“Panel Data”&#xff08;面板数据&#xff09;和“Python数据分析”&#xff08;data analysis&#xff09;。这个库现在由…

[AutoSar]BSW_Com09 CAN driver 模块FULL(BASIC)CAN、FIFO选择

目录 关键词平台说明一、FULL CAN 和Basic CAN 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)autosar版本4.3.1 >>>>>回到总目录<&…

Vue-03

Vue指令 v-bind 作用&#xff1a;动态设置html的标签属性&#xff08;src url title…&#xff09; 语法&#xff1a;v-bind:属性名"表达式" 举例代码如下&#xff1a; 实现效果如下&#xff1a; 案例&#xff1a;图片切换 实现代码如下&#xff1a; 实现的效果…

unity学习(46)——服务器三次注册限制以及数据库化角色信息1--数据流程

1.先找到服务器创建角色信息代码的位置&#xff0c;UserBizImpl.cs中&#xff1a; public PlayerModel create(string accId, string name, int job) {PlayerModel[] playerModelArray this.list(accId);//list是个自建函数&#xff0c;本质通过accId来查询if (playerModelAr…