![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
fresher_Z
这个作者很懒,什么都没留下…
展开
-
进制转换-负数补码
题目出处:力扣https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/class Solution {public: string toHex(int num) { if(num == 0){ return "0"; } long _num = num; if(num < 0){ _原创 2021-10-02 17:36:49 · 154 阅读 · 0 评论 -
两因子差超过x的最小整数-腾讯笔试
题目:对于至少有4个因子的整数n,若其满足任一两个因子之差大于等于x,求最小的整数n思路:对于整数n,1和n本身为其两个因子,只需找到第一个大于1+x的质数l,和第一个大于l+x的质数r,其乘积r*l即为答案 int T; cin >> T; for (int t = 0; t < T; ++t) { int x; cin >> x; int l = 1 + x; for (; l < INT_MAX原创 2021-09-27 11:57:51 · 123 阅读 · 0 评论 -
计算器-腾讯笔试
题目描述:实现一个计算器的功能,输入是字符串,只包含整数字符和‘+’,‘x’,‘@’三种字符运算符。'@'优先级最高,'x'次之,‘+’最低。计算表达式的值。思路:所有表达式均有效,因此符号的个数一定比数字个数少一位。用两个栈实现,一个栈存放数字,一个栈存放运算符。 遍历字符串,同时以运算符的优先级规律做入栈和出栈操作,若当前运算符的优先级大于运算符栈顶元素的优先级,则将该运算符入栈;反之,则弹出栈中元素进行计算,直到当前运算符优先级大于运算符栈顶元素的优先级,将当前运算符入栈。运算符出栈的过程也原创 2021-09-27 11:05:05 · 149 阅读 · 0 评论 -
二分查找左右边界
题目出处:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/思路:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-xiang-jie-by-labuladong/class Solution {public: int left_bound(vector<i.原创 2021-09-04 23:05:25 · 102 阅读 · 0 评论 -
93. 复原 IP 地址
题目出处:https://leetcode-cn.com/problems/restore-ip-addresses/思路:回溯+减枝解决。题目中的字符串全为数字构成,需要处理字符串为0开头的情况。递归函数dfs(duan, startpos, oneAns):代表IP地址的第duan个字符串,duan属于{0,1,2,3};startpos代表第duan+1个字符串的首地址,oneAns代表满足题目条件的一个IP地址划分。 递归终止条件:如果duan==4&&startPo.原创 2021-08-27 11:31:45 · 108 阅读 · 0 评论 -
881. 救生艇
题目出处:https://leetcode-cn.com/problems/boats-to-save-people/思路:要使所需的船数最小,则每艘船上载的人必须尽可能多,即载两人的船数目需要尽可能多。考虑体重最轻的人若最轻的人不能与最重的人上同一条船,则最重的人与任何人都不能上同一条船,所以此时最重的人单独一人上一条船。若最轻的人能与最重的人上同一条船,则要使船的数量少,则必须尽可能利用一艘船的空间,所以此时最轻的人与最重的人上同一条船是最优的选择。class Solution原创 2021-08-26 23:28:01 · 81 阅读 · 0 评论 -
K站中转站内最便宜的航班
题目出处:https://leetcode-cn.com/problems/cheapest-flights-within-k-stops/方法一:dfs+减枝思路:用vector<vector<pair<int, int>>> 记录下有向带权图。从起点开始进行深度优先遍历。最多经过k个中转站,可以转化为最多经过k+1个城市。 使用站点数和每次的花费进行减枝。class Solution {private: int ans = INT_原创 2021-08-24 21:10:07 · 322 阅读 · 0 评论 -
滑动窗口的最大值
题目出处:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/思路:双指针维护区间大小,用map记录区间每个值出现的次数class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { if(nums.size() == 0){ .原创 2021-08-23 22:25:03 · 64 阅读 · 0 评论 -
队列的最大值
题目出处:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/思路1:队列是一个元素先进先出的数据结构要在O(1)的时间复杂度下找出元素的最大值。可以考虑用map存放队列中的元素,其底层是红黑树,输的根节点存放数据的最大值。因此需要修改map的默认排序。 要在O(1)的时间复杂度下插入和弹出元素,则可以用deque实现。class MaxQueue {private: deque<int> dq;.原创 2021-08-23 22:03:28 · 329 阅读 · 0 评论 -
包含min函数的栈
题目出处:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/、思路1:数据栈+最小栈。数据栈正常顺序的数据,最小栈存放当前数据栈中数据的最小值。数据栈的实现细节 入栈与出栈操作与普通栈一致最小栈的实现细节对于入栈操作:如果当前入栈元素小于等于最小栈栈顶元素、或者数据栈为空,则入栈 对于出栈操作:如果当前出栈元素和最小栈的栈顶元素一样,则出栈class MinStack {private:...原创 2021-08-23 21:40:31 · 108 阅读 · 0 评论 -
波峰波谷问题
题目1:排序子序列的个数题目出处:https://www.nowcoder.com/questionTerminal/2d3f6ddd82da445d804c95db22dcc471思路:找出极值点,满足 input[i] > input[i-1] && input[i] > input[i+1] 或者 input[i] < input[i-1] && input[i] < input[i+1]。当上述循环最后一个极值下标为n-3时,.原创 2021-08-22 22:28:32 · 889 阅读 · 0 评论 -
135. 分发糖果
题目出处:https://leetcode-cn.com/problems/candy/思路:两次遍历评分高的孩子比他两侧的相邻孩子获得更多的糖果,等价于同时满足以下两个条件: 条件1:若rating[i]>rating[i+1],则i位的糖果比i+1位的糖果多; 条件2:若rating[i]>rating[i-1],则i位的糖果比i-1位的糖果多。 第一次只考虑满足条件1的时...原创 2021-08-22 21:31:25 · 61 阅读 · 0 评论 -
组合总和问题
组合总和题目出处:https://leetcode-cn.com/problems/combination-sum/思路:递归+回溯。题目要求数组中的数可以无限次的重复选取,因此遍历每一个可能的递归起始点。在每一个递归起始点下,进行递归,枚举以此元素为起点的所有组合情况。由于元素可重复,故二次递归时,再次以本次递归的起点元素为起点。i = index 若元素不可重复,则 i = index+1代码1:class Solution {private: vector<.原创 2021-08-19 11:33:17 · 68 阅读 · 0 评论 -
526. 优美的排列
题目出处:https://leetcode-cn.com/problems/beautiful-arrangement/思路1:深度优先遍历枚举每个可能的结果,统计结果总数递归函数 void dfs(int pos,int &n,vector<bool>& vis):表示对于第pos位可能填充的数字有多少个,显然它受限与vis数组(在没访问过的数中选取)。 递归终止条件 pos == n+1:说明此时数组第n个位置的数已经分配完毕,说明找到一个可行解。 遍历完所.原创 2021-08-16 23:49:34 · 75 阅读 · 0 评论 -
绝对差不超过限制的最长连续子数组
题目出处:https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/思路:双指针+map。map记录着区间[l,r]中的最大值和最小值。如果量两最值之差超过了limit,则不断删除最左边的元素,直至量最值之差满足要求;否则的话,计算此时区间的长度,并且右移右指针。补充:map是基于红黑树实现的,默认是按key值升序排列写法1:cl原创 2021-08-15 10:36:35 · 171 阅读 · 0 评论 -
统计不开心的朋友
题目出处:https://leetcode-cn.com/problems/count-unhappy-friends/思路:由题意可得,如果x不开心,则order[x][u] <order[x][y]且order[u][x] < order[u][v]。(其中order[i][j]表示朋友j在i的朋友列表中的亲密度下标,数值越小表示越亲密)首先要构造二维数组order。 其次要构造一个数据结构match,记录着每个朋友配对的朋友。class Solution {publi.原创 2021-08-14 19:03:33 · 50 阅读 · 0 评论 -
回文子串问题汇总
最长回文子序列题目出处:https://leetcode-cn.com/problems/longest-palindromic-subsequence/思路:动态规划。定义状态dp[i][j],表示nums[i,...j]中的最长回文子串的长度。显然dp[i][i]=1 如果nums[i]==nums[j],则dp[i][j] = dp[i+1][j-1]+2;如果nums[i] != nums[j],则dp[i][j] = max(dp[i][j-1],dp[i+1][j]) 求dp原创 2021-08-13 13:53:53 · 176 阅读 · 0 评论 -
超级丑数---优先级队列
题目出处:https://leetcode-cn.com/problems/super-ugly-number/思路:用一个最小堆存维护每一轮的最小值,每次从堆中弹出最小的元素,并将其与primes中的每个元素相乘,得出的结果入堆(即每次弹出一个最小值,同时将n个新元素入堆)。为了避免堆中的元素重复,这里用一个哈希集合去重。class Solution {public: int nthSuperUglyNumber(int n, vector<int>& prim原创 2021-08-12 19:55:43 · 52 阅读 · 0 评论 -
数组和链表中的环路问题
数组中的环路题目出处:https://leetcode-cn.com/problems/circular-array-loop/思路:类似于链表中找是否存在环路,定义两个指针(一个快指针、一个慢指针),快指针初始时在慢指针的下一个位置。每次慢指针走一步、快指针走两步,两者相遇时则证明存在环。题干中的限制条件:环的长度为1:在环的某一处结点判断(快慢指针相遇处为环的结点),如果此时慢指针的下一个位置还是它本身,则说明环的长度为1。 环中的每个元素的方向一致:判断快指针的每一个位置的方向.原创 2021-08-08 18:38:57 · 107 阅读 · 0 评论 -
拓扑排序基础
拓扑排序将有向无环图中的定点按照图中的指定顺序进行排序。左上方图中v2和v3没有明确的顺序关系。右上图的各个定点均有明确的顺序关系。全序:各个顶点之间有明确的先后关系。 偏序:图中有些顶点之间没有明确的先后关系。拓扑排序流程选择一个没有前驱的定点v(可以使用优先队列维护)。 从图中删除顶点v和所有以该顶点为起点的边。 重复1和2,直到最后一个顶点被输出。如果有定点不能被输出,则一定存在环。#include <iostream>#include <vec...原创 2021-08-08 15:22:17 · 55 阅读 · 0 评论 -
第N个斐波那契数
题目出处:https://leetcode-cn.com/problems/n-th-tribonacci-number/1. 递归解法class Solution {public: int tribonacci(int n) { if(n == 0){ return 0; } if(n == 1){ return 1; } if(n == 2){原创 2021-08-08 13:36:55 · 83 阅读 · 0 评论 -
802. 找到最终的安全状态
题目出处:https://leetcode-cn.com/problems/find-eventual-safe-states/思路:用三种颜色表示每个结点的状态,未访问过(0表示)、已访问过(1表示)、结点是安全的(2表示)。使用bool形式的递归判断一个结点是否为安全的。递归:1. 搞清f(n)和f(n-1)之间的关系。 2.搞清递归的终止条件。 递归关系:按这题来说,就是如果结点node是安全的,则它所有的邻居都必须是安全的;如果结点node是不安全的,则它其中有一个邻居...原创 2021-08-06 23:37:41 · 45 阅读 · 0 评论 -
581. 最短无序连续子数组
题目出处:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/思路1:将数组分为三部分nums1,nums2,nums3,要找出最短的nums2,将nums2排序后整个数组变为有序。换言之,当对整个数组进行排序后,nums1和nums2将不变。所以对比排序前和排序后的数组,就可得出答案。class Solution {public: int findUnsortedSubarray(vector原创 2021-08-03 15:21:26 · 44 阅读 · 0 评论 -
743. 网络延迟时间 (最短距离)
题目出处:https://leetcode-cn.com/problems/network-delay-time/思路:用最短距离算法计算出从节点k到途中其他节点的最短距离。找出其中的最大值即可。dijstra算法:主要的思路是贪心。将所有的节点分为两类,一类是已确定节点,一类是未确定节点。每次从未确定节点中选取一个与起点距离最短的节点,将他归类为已确定节点,并用它来更新从起点到其他所有未确定节点的距离。直到所有的点都被归类为已确定节点。typedef pair<int, int&g原创 2021-08-03 11:57:24 · 235 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
题目出处:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/思路1:定义递归函数findAns(TreeNode* node, TreeNode* p, TreeNode* q),其意义为若以node为根的二叉树中包含节点p或者节点q,则返回true;若以node为根的二叉树中既不包含p也不包含q,则返回false。解答1:/** * Definition for a binary原创 2021-07-31 15:25:00 · 77 阅读 · 0 评论 -
进制的转换
题目出处:https://leetcode-cn.com/problems/excel-sheet-column-number/思路:进制转换,显然这是一个将26进制的数转换成一个十进制的数,按照进制展开并求和即可。class Solution {public: int titleToNumber(string columnTitle) { int ans = 0; int n = columnTitle.size(); for(i原创 2021-07-30 15:59:31 · 46 阅读 · 0 评论 -
1104. 二叉树寻路
题目出处:https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/思路:利用满二叉树的性质求解。满二叉数的结构是镜像对称结构。每求出一个父节点,均需要通过【同一层对称节点和相同的性质】求出其对称节点,将该对称节点作为新的节点。而同一层的对称节点的和与该层的深度有关,故首先应该求出label所在层的深度。class Solution {public: int getDepth(int label){ .原创 2021-07-30 15:11:18 · 51 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
题目出处:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/分析:对于矩阵中的任意一个元素,若该元素的值大于target,则该元素的右下角矩阵中所有的元素都大与target;若该元素的值小于target,则该元素的左上角矩阵中所有的元素都小于target。思路:根据以上分析得出的规律,得出两种方法:从右上点出发,若当前元素的值大于target,则列号减一;若当前元素的值小于target,则行号加一。原创 2021-07-30 14:04:32 · 33 阅读 · 0 评论 -
863. 二叉树中所有距离为 K 的结点---dfs/bfs
题目出处:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/思路:1. 以target为根节点,做深度为k的深度优先遍历。若target不为根节点,则需要知道他的父节点是谁,故在深度优先遍历之前需要用一个哈希表记录每个节点的父节点。因此用根节点做一次深度优先遍历记录每个节点的父节点。 2. 为了保证每次递归均往深处递归,不返回递归,就需要传入先前节点,在保证往深处递归的节点不为先前节点的条件下,进行递...原创 2021-07-29 15:38:38 · 79 阅读 · 0 评论 -
671. 二叉树中第二小的节点
题目出处:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree/思路:通过分析可知,任意一个节点的值都小于等于以该节点为根的子树中所有节点的值。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * .原创 2021-07-28 10:37:16 · 49 阅读 · 0 评论 -
冒泡、插入、快速和归并排序
快速排序int divide(std::vector<int>& arr, int l, int r) { int pos = rand() % (r - l + 1) + l; //[l, r]区间内随机选一个位置 std::swap(arr[pos], arr[l]); int cur = arr[l]; //标准数 while (l < r) { //出口条件为l == r while (l < r &原创 2021-07-26 10:39:41 · 48 阅读 · 0 评论 -
1743. 从相邻元素对还原数组
题目出处:https://leetcode-cn.com/problems/restore-the-array-from-adjacent-pairs/思路:根据本题的特点,如果是首尾两个元素,则只有一个邻居。如果是中间的元素,则有两个邻居。构造哈希表<节点,节点的邻居集合>,遍历该集合便可解决问题。class Solution {private: vector<int> ans; public: // void dfs(int v, unor原创 2021-07-25 21:59:15 · 64 阅读 · 0 评论 -
328. 奇偶链表
题目出处:https://leetcode-cn.com/problems/odd-even-linked-list/思路:1. 第一次遍历,用哈希表记录第i个节点和i+2节点的映射。 2. 一个指针指向第一个节点(奇数节点),一个指针指向第二个节点(偶数节点),分别根据哈希映射找到下一个节点,将其连接。 3. 最后将两个链表相连。/** * Definition for singly-linked list. * struct ListNode...原创 2021-07-19 16:11:44 · 53 阅读 · 0 评论 -
138. 复制带随机指针的链表
题目出处:https://leetcode-cn.com/problems/copy-list-with-random-pointer/思路:两次遍历链表。1.第一次遍历源链表时创建每个节点的副本,同时将各个副本节点按照next指针相连,并用哈希表记录源节点到对应副本节点的映射。2. 第二次同时遍历源链表和副本链表,并将源节点随机指针指向的节点的哈希映射节点找出,将该副本节点随机指针指向找出的映射节点,直至遍历完所有节点。3. 返回副本节点。/*// Definition f..原创 2021-07-16 11:24:33 · 64 阅读 · 0 评论 -
5809. 长度为 3 的不同回文子序列
题目出处:https://leetcode-cn.com/problems/unique-length-3-palindromic-subsequences/思路:用vector<vector>记录每个字符出现的位置。对于ABA,枚举A和B即可。如果A出现的次数大于2,则在A第一次出现的位置和最后一个出现的位置中查找B出现的次数,用二分查找实现。class Solution {public: int countPalindromicSubsequence(string s) {原创 2021-07-11 12:50:40 · 104 阅读 · 0 评论 -
有效的数独
题目出处:https://leetcode-cn.com/problems/valid-sudoku/思路: 遍历,注意哈希数组的使用方法class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { //step1:因为有三种情况,所以考虑创建三个无序哈希表 unordered_map<int,int>row[9];原创 2021-07-08 11:25:48 · 43 阅读 · 0 评论 -
快速幂算法
题目出处:https://leetcode-cn.com/problems/powx-n/思路:要计算x^n,递归的计算x ^ (n//2)。递归终止条件为 n == 0,每次递归都会使n/2,所以时间复杂度为O(n)class Solution {public: double quickMul(double x, long long N) { if (N == 0) { return 1.0; } double y原创 2021-07-08 10:50:37 · 50 阅读 · 0 评论 -
和相同的二元子数组
题目出处:https://leetcode-cn.com/problems/binary-subarrays-with-sum/方法一:哈希表思路:对于区间(i, j],满足Sum[j]-Sum[i]=goal时,就找到一个符合条件的解。用哈希表维护在位置j之前各个前缀和出现的次数,枚举右边界j,在哈希表中查询出现在j之前的Sum[j]-goal的数量,将每个位置j的结果做累加即可。class Solution {public: int numSubarraysWithSum(vector原创 2021-07-08 10:19:29 · 68 阅读 · 0 评论 -
5802. 统计好数字的数目
5802. 统计好数字的数目题目出处:https://leetcode-cn.com/problems/count-good-numbers/思路:对于偶数下标的数字,它有0,2,4,6,8共计5种可能,长度为n的数字字符串有ceil[(1+n]) / 2]个偶数下标。对于奇数下标的数字,它有2,3,5,7共计4种,而长度为n的数字字符串有ceil[n/2]个奇数下标。因此长度为n的数字字符串中,好数字的总数为:5^ceil[(1+n]) / 2] * 4 ^ceil[n/2]用快速幂优原创 2021-07-04 19:09:04 · 139 阅读 · 0 评论 -
5801. 消灭怪物的最大数量
5801. 消灭怪物的最大数量题目出处:https://leetcode-cn.com/problems/eliminate-maximum-number-of-monsters/思路:time[i]记录第i个怪物到达城市所需要的时间,即第i个怪物最晚可被消灭的时间。在每个时间段开始的时间点可以消灭一个怪物,因此消灭怪物的最大值是在每次优先消灭到达城市时间最早的怪物条件下产生的。class Solution {public: int eliminateMaximum(vector<原创 2021-07-04 17:50:08 · 203 阅读 · 0 评论