day37| 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字

文章目录

  • 前言
  • 435. 无重叠区间
    • 思路
    • 方法一
    • 方法二
  • 763.划分字母区间
    • 思路
    • 方法二 补充内容 重叠区间
  • 56. 合并区间
    • 思路
    • 方法一 我自己写的
    • 方法二 教程的思路【更巧妙😶】
  • 738.单调递增的数字
    • 思路
    • 方法一
    • 方法二 使用list、不使用flag
  • 总结


前言

435. 无重叠区间

在这里插入图片描述
注意:[1,2]和[2,3]是没有重叠的

思路

和昨天最后一题思路是一样的,也是先要画出下面的图
在这里插入图片描述

  1. 如果i的左边界大于等于i-1的有边界,说明无重叠
  2. 如果i的左边界小于i-1的有边界,说明有重叠,这个时候result++,并且更新一下右边界为两者最小值

方法一

class Solution(object):def eraseOverlapIntervals(self, intervals):""":type intervals: List[List[int]]:rtype: int"""#别忘了排序intervals = sorted(intervals,key = lambda x:x[0],reverse=False)result = 0for i in range(1,len(intervals)):if intervals[i][0] < intervals[i-1][1]:result += 1intervals[i][1] = min(intervals[i][1],intervals[i-1][1])return result

方法二

763.划分字母区间

在这里插入图片描述

思路

总体思路:
step1: 遍历一遍用hash表记录每个字母的最远index
step2:第二次遍历,定义区间起止index为left和right,right一边遍历一边更新right边界(取max);当前如果遍历的i等于right,说明到了分割点,更新left为right+1;
在这里插入图片描述## 方法一
自己写的
补充:教程里面写hash表格
在这里插入图片描述

import collections
class Solution(object):def partitionLabels(self, s):""":type s: str:rtype: List[int]"""hash_maxindex = collections.defaultdict()for i in range(len(s)):hash_maxindex[s[i]] = iprint(hash_maxindex)left, right = 0, 0 result = []for i in range(len(s)):right = max(right,hash_maxindex[s[i]])if i == right:gap = right - left +1 #是否需要加一代入计算一下result.append(gap)left = i+1return result

方法二 补充内容 重叠区间

统计字符串中所有字符的起始和结束位置,记录这些区间(实际上也就是435.无重叠区间 (opens new window)题目里的输入),将区间按左边界从小到大排序,找到边界将区间划分成组,互不重叠。找到的边界就是答案
具体操作

  1. 遍历第一次,使用[left,right]记录每个字母的起止区间,将这个二元元素按照从小到大排列为list
  2. 遍历list中每一个元素,左边界取最小,右边界取最大,如果到i的时候,它的左边界大于i-1的右边界,说明找到分割点;
    下面的代码是教程里面的,第一个函数是确定左右区间,第二个函数思路跟我一眼;
class Solution:def countLabels(self, s):# 初始化一个长度为26的区间列表,初始值为负无穷hash = [[float('-inf'), float('-inf')] for _ in range(26)]hash_filter = []for i in range(len(s)):if hash[ord(s[i]) - ord('a')][0] == float('-inf'):hash[ord(s[i]) - ord('a')][0] = ihash[ord(s[i]) - ord('a')][1] = ifor i in range(len(hash)):if hash[i][0] != float('-inf'):hash_filter.append(hash[i])return hash_filterdef partitionLabels(self, s):res = []hash = self.countLabels(s)hash.sort(key=lambda x: x[0])  # 按左边界从小到大排序rightBoard = hash[0][1]  # 记录最大右边界leftBoard = 0for i in range(1, len(hash)):if hash[i][0] > rightBoard:  # 出现分割点res.append(rightBoard - leftBoard + 1)leftBoard = hash[i][0]rightBoard = max(rightBoard, hash[i][1])res.append(rightBoard - leftBoard + 1)  # 最右端return res

56. 合并区间

在这里插入图片描述

思路

跟前面的重叠区间是一样的套路,但是可以学习一下教程的写法,它是跟result的结果相比较,比我的号

方法一 我自己写的

总体思路

  1. sort list跟前面一样;
  2. 固定left(因为已经排序过了,left一定是最小的),遍历的时候更新right;如果发现了i[0]>i-1[1],说明没有重叠,这个时候result加入[left,right]的元素,更新left
  3. 但是注意,我这个思路,没有包括最后一个元素,需要最后额外添加
class Solution(object):def merge(self, intervals):""":type intervals: List[List[int]]:rtype: List[List[int]]"""intervals = sorted(intervals,key = lambda x : x[0])#print(intervals)left, right = intervals[0][0], intervals[0][1]result = []for i in range(1,len(intervals)):if intervals[i][0] > right:result.append([left,right])left = intervals[i][0]right = max(intervals[i][1],right)result.append([left,right])return result

方法二 教程的思路【更巧妙😶】

🎀核心思路:先将元素加入到result中,更新的是result里面的right边界;如果到了不重叠的部分,再加入一个新的元素,接着更新新的元素的right边界;
将i[0]与result最后一个元素的1比较

class Solution:def merge(self, intervals):result = []if len(intervals) == 0:return result  # 区间集合为空直接返回intervals.sort(key=lambda x: x[0])  # 按照区间的左边界进行排序result.append(intervals[0])  # 第一个区间可以直接放入结果集中for i in range(1, len(intervals)):if result[-1][1] >= intervals[i][0]:  # 发现重叠区间# 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的result[-1][1] = max(result[-1][1], intervals[i][1])else:result.append(intervals[i])  # 区间不重叠return result

738.单调递增的数字

在这里插入图片描述
如果使用暴力求解,时间复杂度为O(m*n),超时

思路

首先拿两位数来举例
在这里插入图片描述
接着从后往前,按照这个思路来做【不能从前往后的原因在教程里面有】

方法一

实现细节

  1. 设立一个flag,记录需要换成9的位置,最后从flag开始每个都换成9
    为什么不直接满足上面讲的情况就前面一位–,后面一位变成9呢,因为1000这样的情况后面两个因为相等会不变;
  2. flag初始值为size(nums)
    !!python转为str的语法是strNum = str(N)

易错点

  1. str不能直接str[2] = "D"这样修改,只能 ns= ns[:i] + ‘D’ + ns[i + 1:] 这样改动
class Solution(object):def monotoneIncreasingDigits(self, n):""":type n: int:rtype: int"""ns = str(n)flag = len(ns)for i in range(len(ns)-1,0,-1):if ns[i] < ns[i-1]:flag = ins = ns[:i - 1] + str(int(ns[i - 1]) - 1) + ns[i:]if flag != len(ns):for i in range(flag,len(ns)):ns= ns[:i] + '9' + ns[i + 1:]return int(ns)

方法二 使用list、不使用flag

  1. 使用list的句法是strNum = list(str(N))
  2. 不适用flag:具体就是每次满足strNum[i - 1] > strNum[i]的时候,就把i之后的数字都换成9
class Solution:def monotoneIncreasingDigits(self, N: int) -> int:# 将整数转换为字符串strNum = list(str(N))# 从右往左遍历字符串for i in range(len(strNum) - 1, 0, -1):# 如果当前字符比前一个字符小,说明需要修改前一个字符if strNum[i - 1] > strNum[i]:strNum[i - 1] = str(int(strNum[i - 1]) - 1)  # 将前一个字符减1# 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质for j in range(i, len(strNum)):strNum[j] = '9'# 将列表转换为字符串,并将字符串转换为整数并返回return int(''.join(strNum))class Solution:def monotoneIncreasingDigits(self, N: int) -> int:strNum = str(N)        for i in range(len(strNum) - 1, 0, -1):# 如果当前字符比前一个字符小,说明需要修改前一个字符if strNum[i - 1] > strNum[i]:# 将前一个字符减1,以保证递增性质# 使用字符串切片操作将修改后的前面部分与后面部分进行拼接strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + '9' * (len(strNum) - i)       return int(strNum)

总结

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【PL理论】(22) 函数式语言:多参数 | 柯里化 (Currying) : 将多参数函数实现为返回一个函数的函数

&#x1f4ad; 写在前面&#xff1a;本章我们将继续讲解函数式语言&#xff0c;介绍多参数&#xff0c;着重讲解柯里化的概念&#xff0c;将多参数函数实现为返回一个函数的函数。 目录 0x00 多参数&#xff08;Multiple Arguments&#xff09; 0x01 柯里化&#xff08;Curr…

【车载音视频电脑】双卡式行车记录仪,带AI识别分析,支持4路AHD 1080p高清输入

一、产品外观 外观专利设计&#xff0c;铝合金材质&#xff0c;散热好、小巧、易安装&#xff1b;塑胶前面板&#xff0c;美观简洁大方&#xff0c;有独立锁。 二、产品特点 支持4路AHD高清输入1080P*30FPS、720P、D1、CIF分辨率等&#xff1b;支持接IPC&#xff0c;用网口&a…

Java | Leetcode Java题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution {public int maxPoints(int[][] points) {int n points.length;if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i) {if (ret > n - i || ret > n / 2) {break;}Map<Integer, Integer> map ne…

VScode中连接并使用docker容器

前提条件&#xff1a; 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode&#xff0c;按下图顺序操作 调试好之后上传到git上&#xff0c;然后后面…

算法day29

第一题 695. 岛屿的最大面积 本题解法&#xff1a;采用bfs的算法&#xff1b; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素&#xff0c;防治被遍历的元素被二次遍历&#xff1b; 本题具体分析如上题故事&#xff0c;但是由于要求区域的最大面…

5.7 Python内置函数

文章目录 1. 内置模块Aabs()all()any()ascii() Bbin()bool()bytearra()bytes() Ccallable()chr()classmethod()compile()complex() Ddelattr()dict()dir()divmod() Eenumerate()eval()exec()execfile() Ffile()filter()float()format()frozenset() Ggetattr()globals() Hhasatt…

django学习入门系列之第二点《浏览器能识别的标签3》

文章目录 列表表格往期回顾 列表 无序列表 <!-- <ul </ul> 无序列表 --> <ul><li> 内容1 </li><li> 内容2 </li><li> 内容3 </li><li> 内容4 </li> </ul>有序列表 <!-- <ol> &…

自动控制理论---零点和极点、单位脉冲响应

1、实验设备 PC计算机1台&#xff0c;MATLAB软件1套。 2、实验目的 研究四个具有相同极点分布但不同零点分布的二阶系统对单位脉冲响应的影响。绘制各系统的零点和极点分布图。计算并绘制各系统的单位脉冲响应波形。分析零点分布对单位脉冲响应的影响。 3、实验原理说明&am…

x64-linux下在vscode使用vcpkg

1.使用vscode远程连接上对应的linux &#xff0c;或者直接在图形化界面上使用。 2.安装vcpkg 插件&#xff0c;然后打开插件设置。 注意&#xff1a;defalut和host的主机一定和你自己的主机一致&#xff0c;且必须符合vcpkg三元组格式&#xff0c;其中你可以选择工作台的设置&a…

UITableView初识之分组显示数据Demo

基本介绍 继承自UIScrollView&#xff0c;因此可以滚动。 需要Datasource 遵循UITableViewDataSource协议的OC对象&#xff0c;都可以是UITableView的数据源&#xff0c;该协议中的方法告诉UITableView如何显示数据。 关于UITableView UITableView显示分组数据&#xff0c;对应…

C++设计模式——Proxy代理模式

一&#xff0c;代理模式简介 代理模式是一种 结构型设计模式&#xff0c;该模式通过引入一个新的代理对象Proxy&#xff0c;来间接访问原始对象&#xff0c;从而使访问方式变得灵活和可控。 代理对象的设定减少了客户端与真实对象之间的直接交互。 通过引入代理对象来间接访问原…

VRChat 2024年裁员原因与背景深度分析

VRChat&#xff0c;作为2022年元宇宙/VR社交领域的巨头&#xff0c;近期在2024年宣布裁员计划&#xff0c;其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露&#xff0c;VRChat的创始人因缺乏经验和过度自信…

网络安全 - kali 安装

文章目录 Kali 安装教程下载镜像 Kali 安装教程 下载镜像 kali-images安装包下载_开源镜像站-阿里云 (aliyun.com) 下载对应镜像&#xff08;自己挑&#xff09; 打开本机 cmd 并输入一下命令 ipconfig找到 NAT 模式的 IP 地址并从虚拟机中 ping

【Linux】环境设置MySQL表名忽略大小写

目录 说明 一、摘要 二、查看服务器上MySQL情况 方式一&#xff1a;通过Linux方式 方式二&#xff1a;借助可视化工具&#xff08;Navicat&#xff09; 三、MySQL设置忽略表名大小写的参数&#xff08;lower_case_table_names&#xff09; 四、网上解决方案 方法一&…

基于线性核函数的SVM数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真&#xff0c;通过程序产生随机的二维数据&#xff0c;然后通过SVM对数据进行分类&#xff0c;SVM通过编程实现&#x…

94. 二叉树的中序遍历 (Swift版本, 递归)

题目描述 使用递归方法解题 使用了一个递归函数 inorder 来进行二叉树的中序遍历&#xff0c;并将结果存储在数组 ret 中 /*** Definition for a binary tree node.* public class TreeNode {* public var val: Int* public var left: TreeNode?* public var ri…

Python | Leetcode Python题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution:def maxPoints(self, points: List[List[int]]) -> int:n len(points)if n < 2:return nres 2for i in range(n):x1, y1 points[i][0], points[i][1]has {}for j in range(i 1, n):x2, y2 points[j][0], points…

x64汇编fastcall调用约定

x64汇编环境&#xff1a;只需要在x86基础上对项目属性进行设置&#xff0c;将平台设置为所有平台&#xff1b; 以及在将debug改为x64模式即可&#xff1a; 后续写完代码直接生成项目再使用本地调试器进行运行即可。 fastcall调用约定 在x64架构下&#xff0c;fastcall调用约定…

【StableDiffusion】采样方法对比优缺点及评估,采样器 调度器(目前已有的 采样器介绍与评估)

采样器 Sampler 采样方法 决定了 如何从 噪声 生成 图像 的过程&#xff0c;也就是去噪过程如何进行 包含 DPM 的采样方法&#xff08;逆转扩散采样&#xff09; DPM → Diffusion Probabilistic Models&#xff08;扩散概率模型&#xff09; DPM、DPM2 包含 DPM 的采样方…

解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾&#xff0c;玩到最后发现 yum 命令用不了&#xff0c;总是报下面的错误信息&#xff1a; There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/usr/l…