![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一练:经典算法题
文章平均质量分 70
指北针_N
共同进步,顶峰相见。
展开
-
LeetCode力扣刷题——更加复杂的数据结构
更加复杂的数据结构,并查集,LRU最近最少使用。目前为止,我们接触了大量的数据结构,包括利用指针实现的三剑客和 C++ 自带的 STL 等。树可以看成是一个连通且 无环 的 无向 图。我们采用一个链表 list> 来储存信息的 key 和 value,链表的链接顺序即为最 近使用的新旧顺序,最新的信息在链表头节点。同时我们需要一个嵌套着链表的迭代器的 unordered_map>::iterator> 进行快速搜索,调用链表的 splice 函数来直接更新查找成功(cash hit)时的信息原创 2022-11-20 18:50:31 · 1031 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之三:图
图,图论,二分图,拓扑排序,最短路径。作为指针三剑客之三,图是树的升级版。图通常分为有向(directed)或无向(undirected),有 循环(cyclic)或无循环(acyclic),所有节点相连(connected)或不相连(disconnected)。树即是 一个相连的无向无环图,而另一种很常见的图是有向无环图(Directed Acyclic Graph,DAG)。有向无环图样例图通常有两种表示方法,邻接矩阵,邻接表(邻接链表)。原创 2022-11-19 21:30:00 · 714 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之二:树
树,树的递归,树的前序中序后序遍历,二叉查找树,二叉搜索树,BST,字典树,前缀树。作为(单)链表的升级版,我们通常接触的树都是二叉树(binary tree),即每个节点最多有 两个子节点;且除非题目说明,默认树中不存在循环结构。其与链表的主要差别就是多了一个子节点的指针。原创 2022-11-19 20:15:00 · 681 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之一:链表
单链表,链表是由节点和指针构成的数据结构,每个节点存有一个值,和一个指向下一个节点 的指针,因此很多链表问题可以用递归来处理。不同于数组,链表并不能直接获取任意节点的值, 必须要通过指针找到该节点后才能获取其值。同理,在未遍历到链表结尾时,我们也无法知道链 表的长度,除非依赖其他数据结构储存长度。LeetCode 默认的链表表示方法如下。int val;};由于在进行链表操作时,尤其是删除节点时,经常会因为对当前节点进行操作而导致内存或 指针出现问题。原创 2022-11-13 20:00:20 · 1066 阅读 · 0 评论 -
LeetCode力扣刷题——令人头大的字符串
字符串比较,字符串理解,字符串匹配,同构字符串,回文子串。使用著名的Knuth-Morris-Pratt(KMP)算法,可以在 O(m + n) 时间利用动态规划完成匹配。我们可以将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字 符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,。原创 2022-11-12 20:40:49 · 237 阅读 · 0 评论 -
LeetCode力扣刷题——妙用数据结构
Sequence Containers:维持顺序的容器。Container Adaptors:基于其它容器实现的数据结构。Associative Containers:实现了排好序的数据结构。Unordered Associative Containers,数据结构,C++ STL,数组,栈和队列,优先队列,双端队列,哈希表,多重集合和映射,前缀和与积分图。在刷题时,我们几乎一定会用到各种数据结构来辅助我们解决问题,因此我们必须熟悉各种 数据结构的特点。C++ STL 提供的数据结构包括原创 2022-11-09 17:15:39 · 1144 阅读 · 0 评论 -
LeetCode力扣刷题——神奇的位运算
位运算。位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“”算术右移。无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。同时,我们可以建立一个哈希表来存储字母串(在数组的位置)到二进制数字的映射关系,方便查找调用。原创 2022-10-30 21:30:00 · 217 阅读 · 0 评论 -
LeetCode力扣刷题——巧解数学问题
数论,数学,数学问题。随机产生一个数字,然后使用二分法查找其在前缀和中的位置,以模拟加权采样的过程。例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。然而很多数学题的解法并不通用,我们也很难在几道题里把所有的套路讲清楚,因此我们只选择了几道经典或是典型的题目,供大家参考。链表中所有节点被选中的概率相等。给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。原创 2022-10-24 20:30:00 · 968 阅读 · 0 评论 -
LeetCode力扣刷题——化繁为简的分治法
分治法,分治思想。两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1。给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。利用分治思想,我们可以把加括号转化为,对于每个运算符号,先执行处理两侧的数学表达式,再处理此运算符号。的数组的时间复杂度,则归并排序的时间复杂度递推公式为。原创 2022-10-23 20:00:00 · 185 阅读 · 0 评论 -
LeetCode力扣刷题——深入浅出动态规划
动态规划,dp问题,一维动态规划,二维动态规划,股票问题,背包问题,字符串编辑,空间压缩技巧。状态记录(memoization)的优先搜索。用带有状态记录的优先搜索是自上而下的,即从父问题搜索到子问题,若重复搜索到同一个子问题则进行状态记录,防止重复计算。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。,此时可以抢劫的最大数量有两种可能,一种是我们选择不抢劫这个房子,此时累计的金额即为 dp[i-1];原创 2022-10-17 19:00:07 · 360 阅读 · 0 评论 -
LeetCode力扣刷题——一切皆可搜索
搜索、深度优先搜索dfs、广度优先搜索bfs、回溯法、n皇后问题、岛屿问题。因为栈与递归的调用原理相同,而递归相对便于实现,因此刷题时笔者推荐使用递归式写法,同时也方便进行回溯(见下节)。我们从 1 号节点开始遍历,假如遍历顺序是从左子节点到右子节点,那么按照优先向着“广”的方向前进的策略,队列顶端的元素变化过程为 [1]->[2->3]->[4],图的表示方法是,每个位置代表一个节点,每个节点与上下左右四个节点相邻。原创 2022-10-12 16:35:33 · 778 阅读 · 0 评论 -
LeetCode力扣刷题——千奇百怪的排序算法
LeetCode力扣,排序算法。快速排序,桶排序,冒泡排序,选择排序,归并排序。先找一个中枢点(pivot),然后遍历其他数字,小于 pivot 的排左边,大于 pivot 的排右边,中枢点是数组中的第几小的数字就确定了,如果 pivot 与 target 相等,直接返回pivot 位置的数字,如果大于 target ,说明要求的数字在左边部分,否则在右边部分。快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深自己对算法的基本理解,以及解出由这些排序算法引申出来的题目。请注意,你需原创 2022-09-26 20:00:00 · 503 阅读 · 0 评论 -
LeetCode力扣刷题——居合斩!二分查找
LeetCode刷题,二分法,折半法,二分查找,折半查找。第二是在刷题时思考如果最后区间只剩下一个数或者两个数,自己的写 法是否会陷入死循环,如果某种写法无法跳出死循环,则考虑尝试另e一种写法。具体到代码上,二分查找时区间的左右端取开区间还是闭区间在绝大多数时候都可以,因此。二分查找也可以看作双指针的一种特殊情况,但我们一般会将二者区分。二分到了不能再分的情况,如只剩一个数字,且剩余区间里不存在满足条件的解,则说明不存在。指针通常是一步一步移动的,而在二分查找里,指针每次移动半个区间长度。原创 2022-09-24 20:00:00 · 477 阅读 · 0 评论 -
LeetCode力扣刷题——玩转双指针
LeetCode刷题,双指针问题。如果两个指针指向元 素的和大于给定值,我们把右边的指针左移一位,使得当前的和减少一点。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。因为数组已经排好序,我们可以采用方向相反的双指针来寻找这两个数字,一个初始指向最 小的元素,即数组最左边,向右遍历;给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。原创 2022-09-20 19:30:00 · 441 阅读 · 0 评论 -
LeetCode力扣刷题——简单易懂的贪心算法
贪心策略:本题是要维持一个非递减的数列,所以遇到递减的情况时(nums[i] > nums[i + 1]),要么将前面的元素缩小,要么将后面的元素放大。问题是维持非递减的数列,那么我们需要尽可能的让前面的数字变小,然后寻找可以让前面数字变小的条件即可,其余的就让后面数字变大就好了。返回你能获得的 最大 利润。(1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较大的问题的解只由其中一个规模较小的子问题的解决定;采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。原创 2022-09-18 15:36:01 · 677 阅读 · 0 评论 -
每日一练:第十一天——侦探推理
侦探推理题目描述明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:证词内容:I am guilty.I am not guilty.XXX is guilty.XXX is not guilty.Today is XXX证词含义:我是罪犯我不是罪犯xxx 是罪犯( xxx 表示某个原创 2021-11-30 19:30:00 · 6892 阅读 · 0 评论 -
每日一练:第十天——笨小猴
笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果 maxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word ,这样的单词很可能就是正确的答案。输入描述输入一行,是一个单词,其中只可能出现小写字母,并且长度小于 100。输出描述输出两行,第一行是原创 2021-11-28 20:00:00 · 515 阅读 · 0 评论 -
每日一练:第九天——Fizz Buzz 经典问题
Fizz Buzz 经典问题题目描述给定一个整数 N,从 1 到 N 按照下面的规则返回每个数:如果这个数被 3 整除,返回 Fizz。如果这个数被 5 整除,返回 Buzz如果这个数能同时被 3 和 5 整除,返回 FizzBuzz。如果这个数既不能被 3 也不能被 5 整除,返回这个数字。输入描述输入 N,1 < N ≤ 10^4输出描述输出一行,如题干所述。输入输出样例输入15输出FizzBuzz运行限制最大运行时间:1s最大运行内存:256M原创 2021-11-27 19:30:00 · 3926 阅读 · 0 评论 -
每日一练:第八天——标题统计
标题统计题目描述凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。输入描述输入文件只有一行,一个字符串 s (1 ≤ ∣s∣ ≤ 5)。输出描述输出只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。输入输出样例输入Ca 45输出4运行限制最大运行时间:1s最大运行内存: 256M#include <bits/stdc++.h>原创 2021-11-26 20:00:00 · 3446 阅读 · 0 评论 -
每日一练:第七天——生日快乐
生日快乐题目描述windy 的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。现在包括 windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕。windy 主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块。这样,要切成 N 块蛋糕,windy 必须切 N−1 次。为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小。你能帮助 windy 求出这个比值么?输入描述输入三个整数,X,Y,N,原创 2021-11-26 19:45:00 · 210 阅读 · 0 评论 -
每日一练:第六天——最长公共子序列
最长公共子序列题目描述字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列 X = x_0,x_1, ... ,x_m-1,序列 Y = y_0,y_1, ... ,y_k-1 是 X 的子序列,存在 X 的一个严格递增下标序列 i_0,i_1, ... ,i_k-1 ,使得对所有的j=0,1, ... ,k-1,有 x_ij=y_j 。例如,X=ABCBDAB ,Y=BCDB 是 X 的一个子序列。对给定的两个字符序列,求出他原创 2021-11-25 20:30:00 · 537 阅读 · 0 评论 -
每日一练:第五天——火星人
火星人题目描述人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。火星人用一种非常简单的方式来表示数字——掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为 1,2,3……1,2,3……。火星人的任意两根手指都能随意交换位置,他原创 2021-11-23 19:45:00 · 156 阅读 · 0 评论 -
每日一练:第四天——合唱队列
合唱队列题目描述N 位同学站成一排,音乐老师要请其中的 (N−K) 位同学出列,使得剩下的 K 位同学排成合唱队形。合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1,2,⋯K,他们的身高分别为 T_1,T_2,... ,T_K,则他们的身高满足T_1< ... < T_i> T_i+1> ... >T_K (1 ≤ i ≤ K)。你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。输入描述输入两行。.原创 2021-11-22 20:00:00 · 984 阅读 · 0 评论 -
每日一练:第三天——乌托邦树
乌托邦树原创 2021-11-21 20:31:50 · 1091 阅读 · 0 评论 -
每日一练:第二天——接水问题
接水问题题目描述学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1 到 n编号,i 号同学的接水量为 w_i。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 w_i后,下一名排队等候接水的同学 k 马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第 x 秒结束时完成接水原创 2021-11-21 20:31:13 · 616 阅读 · 0 评论 -
每日一练:第一天——明明的随机数
明明的随机数题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N ≤ 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。输入描述第 1 行为 1 个正整数,表示所生成的随机数的个数:N。第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。输出描述输出 2 行,转载 2021-11-21 20:31:37 · 248 阅读 · 0 评论