自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 day33面试100——会议室

给定一个会议时间安排的数组intervals,每个会议时间都会包括开始和结束的时间,请你判断一个人是否能够参加这里面的全部会议。

2024-08-13 21:41:36 759

原创 (day32)leecode热题——买卖股票的最佳时机

代码通过维护一个最小买入价格和最大利润,避免了暴力枚举所有买卖组合的高时间复杂度计算,因而能高效地解决问题。这段代码实现了一个简单的动态规划算法,旨在计算给定股票价格列表中的最大利润。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。动态规划一般分为一维、二维、多维(使用 状态压缩),对应形式为 dp(i)、dp(i)(j)、二进制dp(i)(j)。:如果输入的价格列表为空,直接返回0,因为没有交易机会,利润也为0。

2024-08-12 21:42:14 1214

原创 (day31)leecode热题——多数元素

排序的时间复杂度是O(n log n),而返回中间元素的操作是O(1),因此整体的时间复杂度是O(n log n),空间复杂度为O(1)(假设排序是原地排序的)。算法的基本思想是:通过在数组中持续选取候选元素并统计其支持度,当支持度降为零时更换候选元素,最终剩下的候选元素即为数组的多数元素。无论是 1 1 1 2 3,0 1 1 1 2 还是 -1 0 1 1 1,数组中间的元素总是“多数元素”,毕竟它长度 > ⌊ n/2 ⌋。因此“多数元素”的个数 - 其余元素的个数总和 的结果 肯定 >= 1。

2024-08-09 18:05:53 760

原创 (day31)牛客试题——最大数

给定一个长度为n的数组nums,数组由一些非负整数组成,现需要将他们进行排列并拼接,每个数不可拆分,使得最后的结果最大,返回值需要是string类型,否则可能会溢出。数据范围:1≤n≤100,0≤nums[i]≤10000进阶:时间复杂度O(nlogn),空间复杂度:O(n)输入:[30,1]返回值:"301"输入:[2,20,23,4,8]返回值:"8423220"输入:[2]返回值:"2"输入:[10]返回值:"10"输出结果可能非常大,所以你需要返回一个字符串而不是整数。 代码关键代码

2024-08-03 19:55:27 577

原创 (day31)Leecode题——合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 和 ,另有两个整数 和 ,分别表示 和 中的元素数目。请你 合并 到 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 中。为了应对这种情况, 的初始长度为 ,其中前 个元素表示应合并的元素,后 个元素为 ,应忽略。 的长度为 。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]解释:需要合

2024-08-03 12:49:48 860

原创 (day29)leecode题——二叉树

给定一个二叉树的根节点root,返回它的遍历。[1,3,2]root = [][]root = [1][1][0, 100]递归算法很简单,你可以通过迭代算法完成吗?在树的深度优先遍历中(包括前序、中序、后序遍历),递归方法最为直观易懂,但考虑到效率,我们通常不推荐使用递归。栈迭代方法虽然提高了效率,但其嵌套循环却非常烧脑,不易理解,容易造成 “一看就懂,一写就废” 的窘况。而且对于不同的遍历顺序(前序、中序、后序),循环结构差异很大,更增加了记忆负担。

2024-08-02 12:14:09 1129

原创 (day28)leecode——有效括号

数字 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:整体分析 初始化数据结构:深度优先搜索函数定义:递归生成括号组合:启动递归:返回结果: 时间复杂度:分析回溯问题的时间复杂度,有一个通用公式:路径长度×搜索树的叶子数。对于本题,它等于 O(n⋅C(2n,n))

2024-07-30 17:49:59 1354

原创 (day28)leecode动态规划——打家劫舍

稍微接触过一点动态规划的朋友都知道动态规划有一个 “子问题” 的定义。什么是子问题?子问题是和原问题相似,但规模较小的问题。例如这道小偷问题,原问题是 “从全部房子中能偷到的最大金额”,将问题的规模缩小,子问题就是 “从 k 个房子中能偷到的最大金额 ”,用 f(k) 表示。可以看到,子问题是参数化的,我们定义的子问题中有参数 k。假设一共有 n 个房子的话,就一共有 n 个子问题。动态规划实际上就是通过求这一堆子问题的解,来求出原问题的解。这要求子问题需要具备两个性质:原问题要能由子问题表示。

2024-07-29 18:03:25 1290

原创 (day27)Leecode热题——动态规划

将每一行看做一个状态, 输出结果应该是每个状态构成的列表 lis , 则 lis[i] = [dp],lis 中每一行即一个状态 dp 的左右边界均为1。因此我们只要对最后一行单独处理:最后一行首、尾分别添加一个零然后对应位置求和就可以得到新的一行,思路上比较清晰,占用的时间、空间复杂度也都还挺好<做dp的题目,写代码前需要把状态转移在dp数组上的具体情况模拟一遍,心中有数,确定最后推出来的是想要的结果。当代码出现问题时,找问题的最好方式是把DP数组打印出来,看看究竟是不是按照自己的思路推导的!

2024-07-29 14:59:05 1060

原创 (day27)leecode热题——爬楼梯

即 f(n) 为以上两种情况之和,即 f(n)=f(n−1)+f(n−2) ,以上递推性质为斐波那契数列。转移方程: dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n+1)=f(n)+f(n−1)。设跳上 n 级台阶有 f(n) 种跳法。时间复杂度 O(n) : 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1)。斐波那契数列问题: f(0)=0 , f(1)=1 , f(2)=1。青蛙跳台阶问题: f(0)=1 , f(1)=1 , f(2)=2。

2024-07-28 13:46:39 798

原创 (day26)leecode热题——找到字符串中所有字母异位词

上述代码框架结合了 `defaultdict`、滑动窗口、字符频率统计等数据结构和算法技巧,为解决类似字符串匹配或子数组查找的问题提供了基础结构。通过填充具体的逻辑,可以实现特定功能的滑动窗口算法。

2024-07-27 22:04:16 602

原创 (day25)leecode热题——只出现一次的数字

异或运算有个重要的性质,两个相同数字异或为 0 ,即对于任意整数 a 有 a⊕a=0。例如,我们可以用位运算来进行快速的乘法和除法运算,或者用异或运算来交换两个变量的值,等等。出一个可迭代对象的元素,如果字典中没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在则将该元素对应的值加1。Counter 是一个无序的容器类型,以字典的键值对形式存储,其中元素作为 key,其计数作为 value。传递进来的类型参数,不是用来约束值的类型,更不是约束键的类型,而是当键不存在时,实现一种值的初始化。

2024-07-25 21:08:49 1149

原创 (day23)leecode热题——接雨水

该解决方案采用双指针法,通过从数组的两端同时遍历,并维护两个变量来记录遍历过程中遇到的最大高度,从而计算每个位置可能的雨水量。碎碎念:此题是盛最多水的容器一题的升级版,存在左右边界的都可作为容器来接水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。这种方法通过预计算左边和右边的最大高度,简化了后续的积水量计算过程,是解决雨水陷阱问题的一种经典算法。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

2024-07-24 15:52:46 959

原创 (day22)leecode热题——三数之和

当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。数组排序 O(NlogN),遍历数组 O(n),双指针遍历 O(n),总体 O(NlogN)+O(n)∗O(n),O(n**2)若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 []。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。唯一可能的三元组和为 0。

2024-07-22 23:00:10 645

原创 (day22)leecode热题 ——盛最多水的容器

给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。你不能倾斜容器。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1碎碎念:短板效应(对向双指针问题),自己做的时候只想到双指针更新边界,选了同向指针,需要考虑的情况很多,复杂到无法思考清楚哈哈哈。

2024-07-22 13:16:20 1033

原创 (day21)leecode100. 移动零

不复制数组:不可以开辟新空间,即不能自定义其他数组(若是无这个条件,可以将非零与零分别放入两个数组,再用( [非零].extend([零] )如下所示,我们可以将 l 移动到自身右侧第一个元素为 0 的位置,将 r 移动到 l 右侧第一个元素非 0 的位置,然后交换元素。如下所示,在发现元素 0 时,l 保持不变,r 前进至 Nums[r]!每次发现元素为 0 时增加偏移量,发现元素非 0 且偏移量非 0 时偏移元素。此后 r 前进,一直寻找非 0 元素与 l 处的 0 交换即可。

2024-07-21 22:14:59 848

原创 (day21)leecode hot100字母异位词分组

对于第三个字符串 "tan",排序后为 "ant",将它加入到键为 "ant" 的列表中。对于最后一个字符串 "bat",排序后为 "abt",将它加入到键为 "abt" 的列表中。最终,我们得到的 d 字典如下所示: { 'aet': ['eat', 'tea', 'ate'], 'ant': ['tan', 'nat'], 'abt': ['bat'] } 将 d 字典的所有值转换为列表并返回,即 [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]。

2024-07-21 17:29:54 1296

原创 (day20)*HJ28.素数伴侣

题目描述若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。输入:有一个正偶数 n ,表示待挑选的自然数的个数。

2024-07-18 23:43:53 548

原创 (day19)*leetcode 994.腐烂的橘子

在给定的m x n网格grid012每分钟,腐烂的橘子的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回-1。4-1左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。0因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0。012。

2024-07-17 23:33:08 1012

原创 (day19)HJ25. 数据分类处理

使用 + 运算符或 extend() 方法可以快速合并两个列表,而 zip() 函数和列表推导式提供了更多的灵活性,适用于更复杂的情况。itertools.chain() 函数是合并大量列表的高效选择。根据你的具体需求,选择最合适的方法将使你的代码更加简洁高效。

2024-07-17 13:34:32 1015

原创 (day18) leetcode 204.计数质数

给定整数n,返回所有小于非负整数n的质数的数量。n = 104小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7。

2024-07-15 22:06:14 527

原创 (day17)其他分组不明确的题

HJ108.求最小公倍数*HJ108.求最小公倍数。

2024-07-15 11:37:46 409

原创 (day17)剑指 Offer 32 - 从上到下打印二叉树

在最坏情况下,如果树是满的,则每一层将包含平均 b 个节点,其中 b 是每个节点的子节点数量。在最坏情况下,当搜索到树的最大深度时,空间复杂度为 O(bd)迭代或者O(d)递归,b是平均节点数目,其中 d 是树的深度((b-1)*d)->bd)。在广度优先搜索中,我们从起始节点开始,逐层地探索图中的节点,先探索距离起始节点最近的节点,然后是稍远一层的节点,依次类推。对于树或图来说, O(b^d) ,其中 b是每一层平均节点的数量,d 是树的层数。但它可能会占用较多的内存空间,特别是在图结构较大的情况下。

2024-07-14 14:13:59 1140

原创 (day16)称砝码

2. 迭代每种砝码:对于每个砝码 m_i,在其对应的数量 x_i 之间进行迭代。对于现有的每个可能重量 w,添加 j * m_i(j 在 1 到 x_i 范围内),并将其添加到 new_weights 中。3. 计算所有可能重量:在完成所有砝码迭代后,possible_weights 应包含所有可能称出的重量。import sys。数据范围:每组输入数据满足 1≤𝑛≤10 , 1≤𝑚𝑖≤2000 , 1≤𝑥𝑖≤10。第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])

2024-07-13 20:23:39 627

原创 (day14)NC17 最长回文子串

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。说明:最长的回文子串为"aba"与"bab",长度都为3。进阶: 空间复杂度 𝑂(𝑛),时间复杂度 𝑂(𝑛)要求:空间复杂度 𝑂(1),时间复杂度 𝑂(𝑛2)数据范围: 1≤𝑛≤1000。输入:"ababc"输入:"abbba"

2024-07-11 23:29:54 204

原创 (day13)674. 最长连续递增序列

两个指针left,right分别指向第一个元素和最后一个元素,然后left指针不断递增,right不断递减,直到两个指针相撞或达到其他条件为止.适合解决查找有序数组中满足某些约束条件的一组元素问题、字符串反转问题。1. 使用两个指针left_1, left_2.left_1指向第一个数组的第一个元素(left_1 = 0),left_2指向第二个数组的第二个元素(left_2 = 0)2. 在循环体中将快慢指针向右移动.当满足一定条件时,将慢指针右移(+1), 当满足另一些条件时,将快指针右移(+1)

2024-07-11 00:04:21 1100

原创 (day13)77. 组合

需要注意的细节:输出结果的格式是 [[],[].....],即 List[List[int]] ,故需要对全组合原始结果进行 list处理。时间复杂度:分析回溯问题的时间复杂度,有一个通用公式:路径长度×搜索树的叶子数。对于本题,它等于 O(k⋅C(n,k))。空间复杂度:O(k)。

2024-07-10 17:05:35 241

原创 (day12)面试题 08.08. 有重复字符串的排列组合

其中result为对迭代对象处理之后返回的结果,数据类型为'itertools.permutations',如果需要的话,可以通过list()转化为列表。其中result为迭代对象处理之后返回的结果,数据类型为'itertools.combinations',如果需要的话,可以通过list()转化为列表。回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。r为单个排列元素的长度,不修改的话,默认为迭代对象的元素个数。

2024-07-10 13:48:14 452

原创 (day11)1614. 括号的最大嵌套深度

accumulate函数不仅仅限于对数字进行累积。它还可以使用自定义的二元操作函数来执行累积操作。

2024-07-09 15:24:05 930

原创 (day10)NC52 有效括号序列

2.用顺序表构造栈:方法一:在线性表头部添加元素,并在头部取出元素,因为所有元素都要移动位置,相应的时间复杂度为O(n);方法二:在线性表尾部添加元素,并在尾部取出元素,相应的时间复杂度为O(1)。方法二:在链表尾部添加元素,并在尾部取出元素,因为要遍历整个链表,相应的时间复杂度为O(n)。给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列。括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

2024-07-08 20:15:09 343

原创 (day9)HJ68 成绩排序

注:python2中sorted函数还有一个参数cmp:比较的函数,具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为:大于则返回1,小于则返回-1,等于则返回0,但python3中已经删除。给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开。进阶:时间复杂度:𝑂(𝑛𝑙𝑜𝑔𝑛) ,空间复杂度:𝑂(𝑛)

2024-07-08 15:28:09 329

原创 (day9)NC37 合并区间

排序:按照区间的左端点从小到大来排序区间排序好后我们就按照排序好后的区间进行操作首先定义两个变量 l 和 r,l 用来保存合并区间的左即 start,r 用来保存合并区间的右边界即 end然后使用指针 r 开始往后寻找,如果后续的区间的左端点即 start 比 r 小,就说明是重复区间,可以进行合并,然后更新合并区间的最大值即 r直到区间断开,然后将当前的 l,r 插入到答案里重复上述过程,直到全部区间遍历一次。

2024-07-07 15:28:57 753

原创 (华为od机试day8)HJ27 查找兄弟单词

第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?先输入字典中单词的个数n,再输入n个单词作为字典单词。兄弟单词要求和原来的单词不同。兄弟单词:相同个数的字符的随机排列(同一字符出现次数相同)

2024-07-06 23:45:29 322

原创 *HJ14.字符串排序

比较操作符会依次比较两个字符串中对应位置的字符的编码值,根据编码值的大小关系确定字符串的大小关系。输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。数据范围: 1≤𝑛≤1000 1≤n≤1000 ,字符串长度满足 1≤𝑙𝑒𝑛≤100 1≤len≤100。需要注意的是,Python中的字符串比较是区分大小写的,即大写字母和小写字母被视为不同的字符。如果第一个字符相同,则继续比较下一个字符,直到找到不同的字符或比较完所有字符。

2024-07-05 23:27:56 240

原创 HJ8 合并表记录

数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。

2024-07-05 17:46:35 880

原创 HJ101 输入整型数组和排序标识,对其元素按照升序或降序

reversed()是Python内置的一个函数,它返回一个反转的迭代器。如果你想要一个临时的反转列表,而不是创建一个新的列表,这个函数会非常有用。需要注意的是,reversed()返回的是一个迭代器,如果你需要列表形式的输出,可以将其转换为列表。数据范围: 1≤𝑛≤1000 1≤n≤1000 ,元素大小满足 0≤𝑣𝑎𝑙≤100000 0≤val≤100000。虽然这种方法相对繁琐,但在理解列表和循环的基础上,它可以帮助你更好地理解倒序列表的实现过程。这种特殊的切片方式来轻松地实现列表的倒序。

2024-07-05 10:17:46 194

原创 华为OD(day7)

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。举例:一个ip地址为10.0.3.193每段数字 相对应的二进制数组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。数据范围:保证输入的是合法的 IP 序列。

2024-07-04 23:47:53 202

原创 华为OD(day6)

实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。数据范围:输入的字符串长度满足 1≤𝑛≤20 ,保证输入的字符串中仅出现小写字母。

2024-07-04 13:13:40 288

原创 华为OD(day5)

密码要求:1.长度超过8位2.包括大小写字母.数字.其它符号,以上四种至少三种3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)数据范围:输入的字符串长度满足 1≤𝑛≤100 1≤n≤100。

2024-07-03 22:50:00 255

原创 华为OD(day4)

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。输入:合法坐标为A(或者D或者W或者S) + 数字(两位以内)坐标之间以;分隔。非法坐标点需要进行丢弃。如AA10;A1A;$%$;YAD;等。下面是一个简单的例子 如:A10;S20;W10;D30;X;A1A;B10A11;;A10;处理过程:起点(0,0)+ x = 无效+ A1A = 无效。

2024-07-03 15:25:38 316

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除