![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 62
yinhua405
努力工作
展开
-
1143. 最长公共子序列
是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。最长公共子序列是 "ace" ,它的长度为 3。最长公共子序列是 "abc" ,它的长度为 3。两个字符串没有公共子序列,返回 0。是这两个字符串所共同拥有的子序列。,返回这两个字符串的最长。原创 2022-12-09 07:27:09 · 201 阅读 · 0 评论 -
407. 接雨水 II
给你一个 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。示例 1:输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]输出: 4解释: 下雨后,雨水将会被上图蓝色的方块中。总的接雨水量为1+2+1=4。示例 2:输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]]输出: 1原创 2022-12-06 07:17:46 · 223 阅读 · 0 评论 -
316. 去除重复字母
/20220928 新字符比栈顶小,栈顶字符在后面还有,删除栈顶字符。,请你去除字符串中重复的字母,使得每个字母只出现一次。(要求不能打乱其他字符的相对位置)。原创 2022-09-28 07:37:22 · 196 阅读 · 0 评论 -
941 · 滑动拼图
给定一个拼图板,返回所需的最少移动次数,以解决该板的状态。如果无法解决板的状态,则返回-1。与其相邻的四个方向之一的数字交换位置。时,才能说这块板存在的问题被解决了。表示,还有一块空地用。...原创 2022-08-09 07:19:39 · 292 阅读 · 0 评论 -
342 · 山谷序列
北大学霸令狐冲15年刷题经验总结的《算法小抄模板CheatSheet》助你上岸!现在想让你找所有子序列中满足山谷序列规则的最长的长度为多少?微信添加【jiuzhang0607】备注【小抄】领取。//从左到右统计递减数量。//从右到左统计递减数量。背完这套刷题模板,真的不一样!...原创 2022-07-28 07:22:54 · 146 阅读 · 0 评论 -
884 · 寻找排列
是由一个特殊的整数数组生成的。这个数组含有从1到n(n是加密签名的长度加1)的所有数字,并且每个数字只出现一次。举例来说,加密签名"DI"可以有数组[2,1,3]或者[3,1,2]生成,但是不能由数组[3,2,4]或者[2,1,3,4]生成。[3,2,4]和[2,1,3,4]都不能生成"DI"这个特定的加密签名。'D'表示两个数字是递减关系,'I'表示两个数字是递增关系。的[1,2,...n]的最小字典序的排列。现在,给你一个由字符'D'和'I'构成的。...原创 2022-07-18 07:01:36 · 128 阅读 · 0 评论 -
1169 · 字符串的排列
给定两个字符串和,如果包含的排列,则写一个函数返回true。 换句话说,第一个字符串的排列之一是第二个字符串的。一起战拖呀!微信加【jiuzhang0607】备注【战拖】即可进入官方刷题群,团战offer!样例样例1:样例2: bool checkInclusion(string &s1, string &s2) { // write your code here mapneedMap; for (auto it : s1) ...原创 2022-07-08 07:11:42 · 88 阅读 · 0 评论 -
877 · 同和分割数组
给定一个有n个整数的数组,判断是否存在满足以下条件的三元组 :定义子数组(L, R)表示原始数组从元素下标为L到R的那一段。如果存在这样的三元组,返回 ,否则返回 。样例样例 1:样例 2: bool splitArray(vector &nums) { // write your code here int size = nums.size(); vector sum(nums.size()+1,0); sum[0] = nu...原创 2022-06-15 07:08:47 · 139 阅读 · 0 评论 -
534 · 打劫房屋 II
在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱 。这题是House Robber的扩展,只不过是由直线变成了圈样例样例1输入:原创 2022-05-13 06:58:15 · 82 阅读 · 0 评论 -
392 · 打劫房屋
假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且当相邻的两个房子同一天被打劫时,该系统会自动报警。给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱 。样例样例 1:输入: [3, 8, 4]输出: 8解释: 仅仅打劫第二个房子.样例 2:输入: [5, 2, 1, 3] 输出: 8解释: 抢第一.原创 2022-05-13 06:44:50 · 71 阅读 · 0 评论 -
1492 · 爱吃香蕉的珂珂
珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。1 <= piles.length <= 10^4 ...原创 2022-04-29 07:41:38 · 90 阅读 · 0 评论 -
1596 · 可能的二分法
给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。当可以用这种方法将每个人分进两组时,返回 true;否则返回 false。1 <= N <= 20000 <= dislikes.length <= 100001 <= dislikes[i][j] <=原创 2022-04-27 07:00:56 · 244 阅读 · 0 评论 -
656 · 大整数乘法
以字符串的形式给定两个非负整数 num1 和 num2,返回 num1 和 num2 的乘积。num1 和 num2 的长度都小于110。 num1 和 num2 都只包含数字 0 - 9。 num1 和 num2 都不包含任意前导零。 您不能使用任何内置的BigInteger库内方法或直接将输入转换为整数。样例样例1输入:"123""45"输出:"5535"解释:123 x 45 = 5535样例2输入:"0""0"输出:"0".原创 2022-04-22 07:29:51 · 169 阅读 · 0 评论 -
843 · 数字翻转
给定一个01构成的数组。你可以翻转1变成0或者反转0变成1。请问最少反转多少次可以使得数组满足以下规则:1的后面可以是1或者0,而0的后面必须是0。数组长度 n <= 100000。样例样例 1:输入: [1,0,0,1,1,1]输出: 2解释: 把两个0翻转成1。样例 2:输入: [1,0,1,0,1,0]输出: 2解释: 把第二个1和第三个1都翻转成0。int flipDigit(vector<int> &nums原创 2022-04-21 07:32:33 · 636 阅读 · 1 评论 -
递归反转链表
// 单链表节点的结构class ListNode{ public: int val; ListNode* next; ListNode(int x) { val = x; next = NULL; }};ListNode*traver(ListNode* root, ListNode* &head){ if (root->next == NULL) { ...原创 2022-04-08 06:54:42 · 387 阅读 · 0 评论 -
867 · 四键键盘
假设你有一个特殊的键盘,键盘上有如下键:键1: (A): 在屏幕上打印一个'A'。 键2: (Ctrl-A): 选择整个屏幕。 键3: (Ctrl-C): 复制选择到缓冲区。 键4: (Ctrl-V): 在屏幕上已有的内容后面追加打印缓冲区的内容。现在,你只能按键盘上N次(使用以上四个键),找出你可以在屏幕上打印的“A”的最大数量微信加 jiuzhang15 发送验证信息【视频】领真题考点、面试技巧等免费视频课1 <= N <= 50 答案将在32位有符号整数的范围内。样原创 2022-04-07 07:22:35 · 1025 阅读 · 0 评论 -
296 · 数组去重
描述给定一个长度为NNN的整数数组arrarrarr,返回去掉重复元素之后的数组(去掉重复元素前后数组元素相对次序不变)微信加 jiuzhang15 发送验证信息【视频】领真题考点、面试技巧等免费视频课1≤N≤1051 \leq N \leq 10^51≤N≤105−109≤arr[i]≤109-10^9 \leq arr[i] \leq 10^9−109≤arr[i]≤109样例输入:[3,4,3,6]输出:[3,4,6]解释:元素3重复,所以只需要保留一个元素3而且去重前后原创 2022-03-24 07:41:25 · 144 阅读 · 0 评论 -
363 · 接雨水
描述给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。微信加 jiuzhang15 发送验证信息【国内大厂】领字节、阿里、百度等最新高频题样例样例 1:输入: [0,1,0]输出: 0样例 2:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6挑战O(n) 时间, O(1) 空间O(n) 时间, O(n) 空间也可以接受int trapRainWater原创 2022-03-14 07:34:38 · 87 阅读 · 0 评论 -
174. 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康原创 2021-09-22 07:29:19 · 105 阅读 · 0 评论 -
最长连续子数组
//数组题目001////给定一个只有 0,1 的数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。//////示例 1://////输入: [0, 1]//// 输出 : 2//// 说明 : [0, 1] 是具有相同数量0和1的最长连续子数组。//// 输入 : [0, 1]////// 输出 : 2////// 说明 : [0, 1] 是具有相同数量0和1的最长连续子数组。////// 示例 2 :/...原创 2021-06-22 08:30:47 · 526 阅读 · 0 评论 -
269 · 双色塔
现在有红,绿两种颜色的石头,现在我们需要用这两种石头搭建一个塔,塔需要满足如下三个条件: 第111层应该包含111块石头,第222层应该包含222块,第iii层需要包含iii块石头。 同一层的石头应该是同一个颜色(红或绿)。 塔的层数尽可能多。在满足上面三个条件的前提下,有多少种不同的建造塔的方案?当塔中任意一个对应位置的石头颜色不同,我们就认为这两个方案不相同。石头可以不用完。由于答案可能会很大,请对109+710^9+7109+7取模。red+green≥1red ...原创 2021-06-04 08:08:21 · 441 阅读 · 0 评论 -
258 · 地图跳跃
给定n×n的地图,每个单元都有一个高度,每次你只能够往相邻的单元格移动,并且要求这两个单元格的高度差不超过target。你不能走出地图之外。求出满足从左上角(0,0)走到右下右下角(n-1,n-1)最小的target。n≤100n\leq100n≤100 0≤arr[i][j]≤1000000\leq arr[i][j] \leq 1000000≤arr[i][j]≤100000样例例 1:输入:[[1,5],[6,2]],输出:4,解释:有2条路线:1. 1 -> 5 ->原创 2021-05-31 08:21:19 · 168 阅读 · 0 评论 -
249 · 统计前面比自己小的数的个数
给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,ai的取值范围由 0 到10000)。对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量,并返回数量数组。在做此题前,我们建议你先完成以下三道题: 线段树的构造, 线段树的查询 II,和 统计比给定整数小的数的个数 。样例样例 1:输入:[1,2,7,8,5]输出:[0,1,2,3,2]样例 2:输入:[7,8,2,1,3]输出:[0,1,0,0,2]classSolution...原创 2021-05-21 08:02:03 · 515 阅读 · 0 评论 -
248 · 统计比给定整数小的数的个数
给定一个整数数组 (下标由 0 到 n-1,其中 n 表示数组的规模,数值范围由 0 到 10000),以及一个 查询列表。对于每一个查询,将会给你一个整数,请你返回该数组中小于给定整数的元素的数量。在做此题前,最好先完成 线段树的构造 and 线段树查询 II 这两道题目。样例样例 1:输入: array =[1,2,7,8,5] queries =[1,8,5]输出:[0,4,2]样例 2:输入: array =[3,4,5,8] queries =[2,4]输出:[0,...原创 2021-05-19 08:58:12 · 139 阅读 · 0 评论 -
C++性能优化__优化IO
第一,缩短调用链void stream_read_streambuf(std::istream& f, std::string& result) {std::stringstream s;s << f.rdbuf();std::swap(result, s.str());}第二,减少重新分配void stream_read_string_reserve(std::istream& f,std::string& result){f.se原创 2021-03-09 19:58:33 · 349 阅读 · 0 评论 -
C++性能优化__优化并发
第一,减小临界区的范围在临界区中执行I/O 处理无法提高性能。第二,限制并发线程的数量我们应当使可运行线程的数量少于或等于处理器核心的数量,这样能够移除切换上下文的间接开销。第三,避免惊群当有许多线程挂起在一个事件——例如只能服务一个线程的工作——上时就会发生所谓的惊群(thundering herd)现象。当发生这个事件时,所有的线程都会变为可运行状态,但由于只有几个核心,因此只有几个线程能够立即运行。第四,避免锁护送当大量线程同步,挂起在某个资源或是临界区上时会..原创 2021-03-09 19:53:21 · 243 阅读 · 0 评论 -
C++性能优化_优化模式
1.预计算可以在程序早期,例如设计时、编译时或是链接时,通过在热点代码前执行计算来将计算从热点部分中移除。2.延迟计算通过在真正需要执行计算时才执行计算,可以将计算从某些代码路径上移除。3.批量处理每次对多个元素一起进行计算,而不是一次只对一个元素进行计算。4.缓存通过保存和复用昂贵计算的结果来减少计算量,而不是重复进行计算。5.特化通过移除未使用的共性来减少计算量。6.提高处理量通过一次处理一大组数据来减少循环处理的开销。7.提示通过在代码中加入可能会改善性原创 2021-03-09 19:25:43 · 159 阅读 · 0 评论 -
C++性能优化指南_优化字符串
1.使用复合赋值操作避免临时字符串std::string remove_ctrl_mutating(std::string s) { std::string result; for (int i=0; i<s.length(); ++i) { if(s[i] >= 0x20) result += s[i]; } return result;}2.通过预留存储空间减少内存的重新分配std::string r原创 2021-03-09 19:18:38 · 212 阅读 · 0 评论 -
191. 乘积最大子序列
找出一个序列中乘积最大的连续子序列(至少包含一个数)。数组长度不超过20000乘积最大的子序列的积,小于2147483647您在真实的面试中是否遇到过这个题? 样例样例 1:输入:[2,3,-2,4]输出:6样例 2:输入:[-1,2,4,1]输出:8 int maxProduct(vector<int> &nums) { // write your code here int size = nums.size();...原创 2021-03-08 08:47:20 · 82 阅读 · 0 评论 -
188. 插入五
188. 插入五给定一个数字,在数字的任意位置插入一个5,使得插入后的这个数字最大样例样例 1:输入: a = 234输出: 5234 注意事项∣a∣≤106|a| \leq 10^6∣a∣≤106int InsertFive(int a) { // write your code here std::stack<int> intS ; int b = a;...原创 2021-02-24 08:34:53 · 742 阅读 · 0 评论 -
185. 矩阵的之字型遍历
185. 矩阵的之字型遍历给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。样例样例 1: 输入: [[1]] 输出: [1]样例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10, 11, 12] ] 输出: [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]vector<int>...原创 2021-02-19 09:43:48 · 184 阅读 · 0 评论 -
163. 不同的二叉查找树
163. 不同的二叉查找树给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?样例样例 1:输入:n = 3输出:5解释:有5种不同形态的二叉查找树:1 3 3 2 1\ / / / \ \ 3 2 1 1 3 2/ / \ \2 1 2...原创 2020-12-17 08:47:05 · 63 阅读 · 0 评论 -
算法---二叉树的建立,查找,删除
二叉排序树,若有左子树,则左子树上所有结点数据小于根结点数据,若有右子树,则右子树上所有结点数据大于根结点数据。左,右子树本身又各是一棵二叉排序树。#includetypedef struct bst{ int data; struct bst *left; struct bst *right;}BSTree转载 2017-05-03 10:56:01 · 252 阅读 · 0 评论 -
算法---折半查找
折半查找,又称为二分查找。这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列。int binarysearch(int s[],int n,int key){ int low,high,mid; low = 0; high = n -1; while(low转载 2017-05-03 08:42:47 · 221 阅读 · 0 评论 -
算法---顺序查找
顺序查找,从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若相等则表示查找成功,返回序号。int seqsearch(int s[],int n,int key){ int i; for(i=0;s[i] != key; i++) ; if(i return i;转载 2017-05-02 16:57:52 · 264 阅读 · 0 评论 -
算法---希尔排序
希尔排序,又称缩小增量排序。将需要排序的序列划分为若干个较小的序列,对这些序列进行直接插入排序,通过这样的操作可使需要排序的数列基本有序,最后再使用一次直接插入排序。void shellsort(int a[],int n){ int d,i,j,x; d = n /2; while(d >= 1) {转载 2017-05-02 15:31:39 · 156 阅读 · 0 评论 -
算法---直接插入排序法
插入排序,通过构建有序序列,对于未排数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素向后移动,为最新元素提供插入空间。void insertsort(int a[],int n){ int i,j,t; for(i=1;i {转载 2017-05-02 14:50:48 · 223 阅读 · 0 评论 -
算法---快速排序算法
快速排序法是,通过一遍排序将需要排序的数据划分成两部分,使其中一部分数据比另一部分数据小,然后再分别对这两部分数据继续进行这种排序,按此规则继续,直到每个部分为空或只含有一个数时,整个快速排序结束。int division(int a[],int left,int right){ int base = a[left]; while(left转载 2017-05-02 10:54:24 · 184 阅读 · 0 评论 -
算法---冒泡法
void bubblesort(int a[],int n){ int i,j,t; for(i=0;i { for(j=n-1;j>i;j--) { if(a[j-1] > a[j])转载 2017-05-02 10:00:25 · 198 阅读 · 0 评论 -
算法---冒泡法--改进型
void bubblesort(int a[],int n){ int i,j,t,flag; flag = 1; for(i=0;i { flag = 0; for(j=n-1;j>i;j--) {转载 2017-05-02 10:24:39 · 177 阅读 · 0 评论