当前位置: 首页 > news >正文

Leetcode刷题日记16(151-160)

目录

  • 问题1:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题2:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题3:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题4:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题5:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:
  • 问题6:
    • 问题链接:
    • 问题描述:
    • 实例:
    • 代码:

问题1:

问题链接:

151. 反转字符串中的单词

问题描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

实例:

示例1: 输入:s="the sky is blue" 输出:"blue is sky the" 示例2: 输入:s=" hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。 示例3: 输入:s="a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

代码:

classSolution:defreverseWords(self,s:str)->str:s=s.strip()# 删除首尾空格i=j=len(s)-1res=[]whilei>=0:whilei>=0ands[i]!=' ':i-=1# 搜索首个空格res.append(s[i+1:j+1])# 添加单词whilei>=0ands[i]==' ':i-=1# 跳过单词间空格j=i# j 指向下个单词的尾字符return' '.join(res)# 拼接并返回

问题2:

问题链接:

152. 乘积最大子数组

问题描述:

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个32-位 整数。 请注意,一个只包含一个元素的数组的乘积是这个元素的值。

实例:

示例1:输入:nums=[2,3,-2,4]输出:6解释:子数组[2,3]有最大乘积6。 示例2:输入:nums=[-2,0,-1]输出:0解释:结果不能为2,因为[-2,-1]不是子数组。

代码:

classSolution:defmaxProduct(self,nums:List[int])->int:n=len(nums)f_max=[0]*n f_min=[0]*n f_max[0]=f_min[0]=nums[0]foriinrange(1,n):x=nums[i]# 把 x 加到右端点为 i-1 的(乘积最大/最小)子数组后面,# 或者单独组成一个子数组,只有 x 一个元素f_max[i]=max(f_max[i-1]*x,f_min[i-1]*x,x)f_min[i]=min(f_max[i-1]*x,f_min[i-1]*x,x)returnmax(f_max)

问题3:

问题链接:

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

问题描述:

已知一个长度为 n 的数组,预先按照升序排列,经由1到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7]在变化后可能得到: 若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次 的结果为数组[a[n-1],a[0],a[1],a[2],...,a[n-2]]。 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须设计一个时间复杂度为O(log n)的算法解决此问题。

实例:

示例1: 输入:nums=[3,4,5,1,2]输出:1解释:原数组为[1,2,3,4,5],旋转3次得到输入数组。 示例2: 输入:nums=[4,5,6,7,0,1,2]输出:0解释:原数组为[0,1,2,4,5,6,7],旋转4次得到输入数组。 示例3: 输入:nums=[11,13,15,17]输出:11解释:原数组为[11,13,15,17],旋转4次得到输入数组。

代码:

classSolution:deffindMin(self,nums:List[int])->int:left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]>nums[-1]:left=mid+1else:right=mid-1returnnums[left]

问题4:

问题链接:

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

问题描述:

已知一个长度为 n 的数组,预先按照升序排列,经由1到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,4,4,5,6,7]在变化后可能得到: 若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],...,a[n-1]]旋转一次 的结果为数组[a[n-1],a[0],a[1],a[2],...,a[n-2]]。 给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须尽可能减少整个过程的操作步骤。

实例:

示例1: 输入:nums=[1,3,5]输出:1示例2: 输入:nums=[2,2,2,0,1]输出:0

代码:

classSolution:deffindMin(self,nums:[int])->int:nums=sorted(nums)returnnums[0]
classSolution:deffindMin(self,nums:[int])->int:i,j=0,len(nums)-1#关于选择点这里,左边的都要大于右边的数据whilei<j:m=(i+j)//2ifnums[m]>nums[j]:i=m+1elifnums[m]<nums[j]:j=melse:returnmin(nums[i:j])returnnums[i]

问题5:

问题链接:

155. 最小栈

问题描述:

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类:MinStack()初始化堆栈对象。 voidpush(int val)将元素val推入堆栈。 voidpop()删除堆栈顶部的元素。 inttop()获取堆栈顶部的元素。 intgetMin()获取堆栈中的最小元素。

实例:

示例1:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,null,0,-2]解释: MinStack minStack=newMinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin();-->返回-3.minStack.pop();minStack.top();-->返回0.minStack.getMin();-->返回-2.

代码:

classMinStack:def__init__(self):self.stack=[]self.min_stack=[]defpush(self,val:int)->None:self.stack.append(val)ifnotself.min_stackorval<=self.min_stack[-1]:self.min_stack.append(val)defpop(self)->None:ifself.stack.pop()==self.min_stack[-1]:self.min_stack.pop()deftop(self)->int:returnself.stack[-1]defgetMin(self)->int:returnself.min_stack[-1]

问题6:

问题链接:

160. 相交链表

问题描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统 的输入如下(你设计的程序 不适用 此输入): intersectVal-相交的起始节点的值。如果不存在相交节点,这一值为0listA-第一个链表 listB-第二个链表 skipA-在 listA 中(从头节点开始)跳到交叉节点的节点数 skipB-在 listB 中(从头节点开始)跳到交叉节点的节点数 评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

实例:

代码:

# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defgetIntersectionNode(self,headA:ListNode,headB:ListNode)->Optional[ListNode]:#假设公共部分是z,上半段是x,下半段是y,在(x+z)+y=(y+z)+x,意思就说两者都开始走,走完以后再走对方的路,x走y,y走x,会相遇,如果没相遇则是有空节点。p,q=headA,headBwhilepisnotq:ifp:p=p.nextelse:p=headBifq:q=q.nextelse:q=headAreturnp
http://www.rkmt.cn/news/112587.html

相关文章:

  • 2025年度最佳远控软件评选:十佳品牌出炉,国产软件居多!
  • python爬虫学习(搜索)
  • DownKyi终极指南:5步掌握B站视频批量下载技巧
  • 大雪深埋强化课划重点|保号性专题
  • 2、深入探索Bash脚本编程
  • vue基于Springboot框架的个人健康运动健身饮食人体血糖监测系统
  • 湖南网安基地:湖南地区口碑最好的网络安全培训机构深度测评
  • LobeChat能否实现AI剪纸艺术家?民俗图案生成与文化寓意解读
  • 光伏设计还在开盲盒?iSolarBP的寻优设计,让我从“画图匠”变“方案大师”
  • python pandas操作excel
  • 6‘-唾液乳糖— 引领婴幼儿营养与健康的下一代母乳低聚糖核心成分 CAS:35890-39-2
  • 机器学习--线性回归
  • Pinterest灵感采集:LobeChat发现流行美学
  • 半年成功入行网络安全!一位零基础转行者的真实学习路径与资源全分享
  • 如何将VSCode的扩展同步到另一台电脑
  • 别再纠结!2025高薪IT赛道二选一:云计算运维与网络安全的真实转行故事与选择建议
  • 14、Red Hat Linux实用应用指南
  • 物联网边缘设备+LobeChat分布式AI终端网络
  • 数字员工赋能熊猫智汇推动AI销售工具智能化转型
  • 零基础如何高效转行网络安全?大佬亲授半年计划,避开90%的入门弯路
  • 投资决策支持:LobeChat整理行业研报要点
  • LobeChat安全机制解读:保障企业数据不出内网
  • 用LobeChat实现团队共享AI助手的权限管理策略
  • Java开发者的AI逆袭之路:不用抛弃Java,照样在大模型时代吃得开(必收藏)
  • 如何将当前工程文件发布版本,并使用?
  • 寓言创作工坊:LobeChat教你做道德启示
  • NVIDIA Profile Inspector深度解析:解锁显卡性能的终极工具
  • 钉钉机器人网关接入LobeChat对外服务能力
  • LobeChat新闻摘要生成服务搭建过程
  • 东南大学论文模板配置终极指南:5分钟快速上手