
LeetCode
文章平均质量分 65
物随心转
子曰:“学而时习之,不亦说乎?”
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单链表的头插法与尾插法
头插法原创 2022-12-25 21:01:30 · 1687 阅读 · 0 评论 -
优先队列的实践
优先队列原创 2022-11-23 21:40:52 · 335 阅读 · 0 评论 -
滑动窗口最大值——单调队列的实践
单调队列原创 2022-11-23 21:15:13 · 360 阅读 · 0 评论 -
二叉堆的介绍
二叉堆原创 2022-11-16 22:18:04 · 545 阅读 · 0 评论 -
哈希表(hash_table)的原理
hash表的原理原创 2022-11-16 21:21:42 · 1365 阅读 · 0 评论 -
构造二叉树的实践
二叉树的构造问题原创 2022-11-09 21:00:24 · 481 阅读 · 0 评论 -
差分数组的使用
差分数组转载 2022-11-08 22:47:13 · 365 阅读 · 0 评论 -
最大二叉树——递归分治法与单调栈的实践
具体的,我们可以从前往后处理所有的 nums[i],若存在栈顶元素并且栈顶元素的值比当前值要小,根据我们从前往后处理的逻辑,可确定栈顶元素可作为当前 nums[i] 对应节点的左节点,同时为了确保最终 nums[i]的左节点为 [0,i−1] 范围的最大值,我们需要确保在构建 nums[i] 节点与其左节点的关系时,[0,i−1] 中的最大值最后出队,此时可知容器栈具有「单调递减」特性。根据题目对树的构建的描述可知,nums 中的任二节点所在构建树的水平截面上的位置仅由下标大小决定。原创 2022-11-06 11:28:14 · 250 阅读 · 0 评论 -
队列的C++实现
队列转载 2022-10-30 21:35:41 · 212 阅读 · 0 评论 -
链表的C++实现
链表原创 2022-04-01 22:46:59 · 131 阅读 · 0 评论 -
栈的C++实现
.h文件#pragma once#ifndef STACKP_H_#define STACKP_H_#endiftemplate<typename Type>class Stack{private: enum {MAX = 10}; Type items[MAX];//hold stack items int top;//index for stackp...原创 2019-11-05 08:41:54 · 231 阅读 · 0 评论 -
C++控制台输入
1、int main(){ string str; while (getline(cin, str)) { cout<< str<<endl; }return 0;} 2、int main(){ char str[1000000]; while (gets_s(str)) { cout << str; }return 0;|原创 2020-08-05 21:41:43 · 6900 阅读 · 0 评论 -
枚举法的使用
枚举转载 2022-10-20 22:54:43 · 1285 阅读 · 0 评论 -
模式匹配——枚举法的实践
leetcode转载 2020-06-22 22:17:27 · 803 阅读 · 0 评论 -
柱状图中最大的矩形——单调栈的实践
单调栈原创 2022-09-30 22:01:14 · 502 阅读 · 0 评论 -
接雨水——单调栈的实践
给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6一、暴力破解法假设每一列可以存水,只要我们遍历每一列,计算存水的总和即可。现在我们根据图上的显示,计算出第1列存水0,第2列存水0,第3列存水1,第4列存水0,第5列存水1,,,如何计算当前列的水...原创 2019-10-24 20:35:49 · 358 阅读 · 0 评论 -
单调栈的使用
LeetCode stack原创 2022-09-12 20:49:19 · 303 阅读 · 0 评论 -
二维数组的各种翻转
leetcode原创 2022-08-06 09:35:30 · 4610 阅读 · 2 评论 -
双指针的实践
一、原理双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。伪代码 void find(int[] list) { int left = 0; int right = list.length - 1; //遍历数组 while (left <= right) {原创 2022-02-27 22:46:04 · 188 阅读 · 0 评论 -
合并区间——双指针法的实践
一、题目以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。二、排序解法我们用数组 merged 存储最终的答案。首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间: 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们...转载 2021-09-19 13:20:42 · 561 阅读 · 0 评论 -
动态规划的实践
一、动态规划要解决的问题动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列,背包问题呀等。只要我们发现某一过程包含多种状态(情况),后一种状态的生成依赖于前面的情况,就可以使用动态规划二、一般步骤1、 确定dp数组(dp table)以及下标的含义2 、确定递推公式3、给dp数组初始化4、确定遍历顺序代码框架如下:# 初始化 base casedp[0][0][...] = base#.原创 2022-03-05 21:59:14 · 227 阅读 · 0 评论 -
位运算的实践
一、只出现一次的数字 III1.1题目给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?1.2、分析如果使用hash表,就太简单了,这里使用位运算的方式来解答一下。让我们先来考虑一个比较简单的问题:如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?答案很简单:全员进行异或操作即可。考虑异.原创 2021-09-19 10:33:08 · 191 阅读 · 0 评论 -
双指针的实践
一、双指针的一般解法双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。它只是一种算法技巧。二、26题-删除有序数组中的重复项2.1 题目给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。2.2 解析这道题目的要求是:对.原创 2021-08-08 11:08:19 · 158 阅读 · 0 评论 -
贪心算法的实践
一、通用步骤贪心算法一般分为如下四步: 将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 二、455题分发饼干2.1题目假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子原创 2021-07-26 22:47:08 · 208 阅读 · 0 评论 -
不用加减乘除做加法——位运算的实践
一、题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。二、解题思路本题考察对位运算的灵活使用,即使用位运算实现加法。设两数字的二进制形式 a,b,其求和 s=a+b,a(i) 代表 a 的二进制第 i 位,则分为以下四种情况:观察发现,无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位)。因此,无进位和 n 与进位 c 的计算公式如下:即可将 s=a+bs = a + bs=a+b 转化为:s=原创 2021-06-29 22:37:08 · 226 阅读 · 0 评论 -
组合排列——回溯法的实践
一、模板对于回溯问题,可以给一个模板result = []def backtracking(参数) { if (终止条件) { result.add(路径) return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 } }二、46原创 2021-07-20 08:55:06 · 261 阅读 · 0 评论 -
颜色填充——DFS与BFS的实践
一、题目编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。二、解析经典的DFS题目,基本都是按着上,下,左,右遍历,直接上代码三、代码3.1 最简洁的DFSclass Solution {原创 2021-05-22 12:26:42 · 369 阅读 · 0 评论 -
DFS与BFS的实践
一、岛屿的最大面积1.1题目给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)1.2 解析这种需要遍历二维数组的,一定是DFS或者BFS步骤如下:1.从某位置出发,从四个方向探寻相连的土地2.每探寻到一块土地,计数..原创 2021-05-18 09:03:03 · 304 阅读 · 0 评论 -
目标和——DFS递归的实践
一、题目给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。二、思路我们可以使用递归,枚举出所有可能的情况。具体地,当我们处理到第 i 个数时,我们可以将它添加 + 或 -,递归地搜索这两种情况。当我们处理完所有的 N 个数时,我们计算出所有数的和,并判断是否等于 S。class Solution {原创 2020-12-17 08:48:39 · 259 阅读 · 1 评论 -
地图分析——广度优先搜索的实践
一、题目你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。如果网格上只有陆地或者海洋,请返回 -1。二、解析考虑最朴素的方法,即求出每一个海洋区转载 2021-02-23 08:39:20 · 238 阅读 · 0 评论 -
搜索二维矩阵 II——DFS的实践
一、题目编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。二、解析DFS+标记 只要懂DFS的感觉这个题还是蛮好解决的,也算是DFS里面简单的一种了 从左上角开始沿着右侧、下侧进行DFS 这样保证了全部是升序,所以只要访问到的某个数字大于target就直接返回false 当然避免重复访问的问题应该标记已经访问过的结点,我这里...转载 2020-09-15 23:15:28 · 284 阅读 · 0 评论 -
整型数组与二进制之间的转换
一、题目1有数组[1,0,1,0,1,1,0]转二进制int bin = 0; // 二进制的数字 int dig = 1; for (int i = cells.size() - 1; i >= 0; i--) { //将cells转换成二进制数bin bin += cells[i] * dig; dig *= 2; } return bin;二、题目2将二进制转为数组//将最原创 2021-05-09 23:20:19 · 640 阅读 · 0 评论 -
两个字符串相加——字符串进位的实践
一、二进制求和1.1 题目给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字1和0。1.2、题解我们可以借鉴「列竖式」的方法,末尾对齐,逐位相加。在十进制的计算中「逢十进一」,二进制中我们需要「逢二进一」。1、先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。2、我们使用一个变量 carry 表示上一个位置的进位,初始值为 03、记当前位置对其的两个位为 ai 和 bi,则每一位为 (carry+ai+bi) mo...原创 2021-04-11 21:18:30 · 4882 阅读 · 0 评论 -
四数之和——双指针的实践
参考:https://leetcode-cn.com/problems/4sum/solution/si-shu-zhi-he-by-leetcode-solution/https://leetcode-cn.com/problems/3sum-closest/https://leetcode-cn.com/problems/3sum/solution/15-san-shu-zhi-he-ha-xi-fa-shuang-zhi-zhen-fa-xi-2/原创 2021-04-07 08:26:00 · 315 阅读 · 0 评论 -
三数之和——双指针法的实践
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。答案class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { int n = nums.size(); sort(n原创 2020-06-13 21:09:06 · 341 阅读 · 0 评论 -
字符串:替换空格 ——双指针法的实践
一、题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."二、解析首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。为什么要从后向前填充,从前向后填充不行么?从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。「其实很多数组填充类的问题转载 2021-02-28 22:38:12 · 272 阅读 · 0 评论 -
二维区域和的检索——前缀和的实践
一、题目给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1,col1) ,右下角为 (row2,col2) 。二、解析转载 2021-03-06 14:11:45 · 280 阅读 · 0 评论 -
旋转链表——快慢指针法的实践
一、题目给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动k个位置。示例1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL示例 2:输入: 0->1->..转载 2021-03-31 09:02:16 · 230 阅读 · 0 评论 -
区域和检索 - 数组不可变——前缀和法的实践
一、题目给定一个整数数组 nums,求出数组从索引i到j(i≤j)范围内元素的总和,包含i、j两点。二、解析题目很简单,如果直接暴力法,即存储数组 nums的值,每次调用 sumRange 时,通过循环的方法计算数组 nums 从下标 i 到下标 j 范围内的元素和,需要计算 j−i+1个元素的和。由于每次检索的时间和检索的下标范围有关,因此检索的时间复杂度较高,如果检索次数较多,则会超出时间限制。class NumArray {public: vector<in...原创 2021-03-06 14:06:30 · 184 阅读 · 0 评论 -
数组的度——哈希表与滑动窗体法的实践
一、题目给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。二、哈希表法解析记原数组中出现次数最多的数为 x,那么和原数组的度相同的最短连续子数组,必然包含了原数组中的全部 x,且两端恰为 x 第一次出现和最后一次出现的位置。因为符合条件的 x 可能有多个,即存在多个不同的数,它们在原数组中出现次数相同。所以为了找到这个子数组,我们需要统计每一个数出现的原创 2021-02-24 08:39:53 · 201 阅读 · 0 评论