leetcode
不瘦20斤不换头像
这个作者很懒,什么都没留下…
展开
-
leetcode——【课程表III】
两个原则,deadline小的优先;持续时间短的课程优先;具体细节:按照deadline排序,维护一个大顶堆,对截止时间早的优先入队,当入队元素无法入队时,尝试观察队顶持续时间最长的元素是否比当前元素长,如是的话,进行替换。...原创 2022-08-09 13:32:36 · 1329 阅读 · 1 评论 -
leetcode——【裁剪数字后查询第k小的数字】
代码】leetcode——【裁剪数字后查询第k小的数字】原创 2022-07-25 23:46:32 · 187 阅读 · 0 评论 -
leetcode——【开灯泡】
代码】leetcode——【开灯泡】原创 2022-07-17 14:32:10 · 1205 阅读 · 0 评论 -
leetcode——【第k个最大元素】
快速排序的变种堆排序原创 2022-06-29 12:37:15 · 1501 阅读 · 0 评论 -
leetcode——【自定义rand()生成】
自定义rand()生成原创 2022-06-24 22:17:39 · 960 阅读 · 0 评论 -
leetcode——【差分数组】
当我们需要对原数组的不同区间施加不同的增量,我们只要按规则修改差分数组即可。对于区间改变问题,可采用此种方法,对区间起始位置采用加操作,区间结束位置+1采用减操作。日程安排表问题思路因为此处时间跨度较大,采用map的结构维护差分数组(因为其对key自动排序的缘故),在维护差分数组后并进行遍历比较一次,得到此刻最大的预定次数。先去试着添加,然后检查添加后是否符合要求,若不符合,退回添加。采用上述方法或者使用map构建,lower_bound进行快速的二分查找。使数组互补最少的操作次数原创 2022-06-15 18:23:08 · 1252 阅读 · 0 评论 -
leetcode——【升序砍树】
题目思路直接BFS——按照树高排序,转换成多个最短路径叠加问题,其中引入visited数组,保存已经访问过的节点。Dijkstra算法——在BFS时候,引入优先队列,优先队列维护已用步数最少的路径方法。A* 启发式搜索算法——在BFS时候,维护剩余曼哈顿距离最小的点,得到最终结果。实现直接BFSclass Solution {public: int len_m; int len_n; vector<vector<int>> edges原创 2022-05-26 14:38:58 · 369 阅读 · 0 评论 -
leetcode——【最小、大堆实现】
概念堆是一种数据结构,就是每个节点根据某种规则排序, 从根节点往下都符合某种规律,根节点的值比所有节点的值都大, 称为最大堆;根节点的值比所有节点的值都小, 称为最小堆。思路实现class Solution {public: void adjust_heap(vector<int>& nums, int father, int len) { int left = 2 * father + 1; int right = 2 * fathe原创 2022-05-23 16:33:55 · 236 阅读 · 0 评论 -
leetcode——【重载排序】
关注stable_sort用法class Solution {public: vector<string> reorderLogFiles(vector<string>& logs) { stable_sort(logs.begin(), logs.end(), [&](const string& a, const string& b) { int pos1 = a.find_first_of(".原创 2022-05-16 13:43:22 · 130 阅读 · 0 评论 -
leetcode——【随机翻转矩阵】
题目思路因为矩阵的大小为mxn,m和n都很大,所以不可能应用空间复杂度O(mxn)的数据结构去处理。并且在随机过程中要尽量少调用rand函数,因此可采用降维二维数组和哈希表映射来解决这个问题,首先将二维数组进行降维,然后引入哈希表,出事状态下可随机的个数total=mxn,每进行一次随机,便减少随机个数,得到的随机数作为key在哈希表中搜索,若不存在,即表明此随机数在之前从未得到过,便输出此随机数对应的位置,并且将此数在哈希表中的值设置为后续不可能随机到的值,即total或者total为key对应的值原创 2022-04-12 14:48:46 · 144 阅读 · 0 评论 -
【leetcode】——线段树
线段树思路实现class NumArray {private: vector<int> segmentTree; int n; void build(int node, int s, int e, vector<int> &nums) { if (s == e) { segmentTree[node] = nums[s]; return; }原创 2022-04-06 17:15:43 · 128 阅读 · 0 评论 -
leetcode——【不用加减乘除做加法】
题目思路实现class Solution {public: int add(int a, int b) { while(b != 0){ int c = (a & b) << 1; a ^= b; b = c; } return a; }};class Solution { public int add(int a, int b) { if (b == 0) { return原创 2022-03-02 16:32:18 · 126 阅读 · 0 评论 -
leetcode——【KMP匹配】
题目KMP匹配思路实现class Solution {public: int strStr(string haystack, string needle) { int len_ss = haystack.size(); int len_pp = needle.size(); if (len_pp == 0) return 0; vector<int> next(len_pp);原创 2022-02-23 21:15:31 · 7923 阅读 · 0 评论 -
leetcode——【课程表II】
题目思路记忆化搜索+DFS对于每个查询数组,我们可以利用dfs进行求解。对[first, second]而言,我们要确定其是否有关联,可以first开始递归,寻找到second结尾则可得到其关联关系。建立关联数组visted,初始化为0,表示为探索过;若为1,表示两者有关联;若为-1表示两者没有关联。dfs设计:当数组值为1时,输出true;值为-1,输出false;若为0,遍历子节点,对子节点dfs,若结果为true,改变数组值为1,并输出true;若子节点结果均为false,则设置数组值为-1原创 2022-02-22 21:33:57 · 105 阅读 · 0 评论 -
leetcode——【课程表】
题目思路拓扑排序问题给定一个包含 nn 个节点的有向图 GG,我们给出它的节点编号的一种排列,如果满足:对于图 GG 中的任意一条有向边 (u, v)(u,v),u 在排列中都出现在 v 的前面。此问题可转换为:求解该图的拓扑排序。DFS设置visited数组,0代表未访问过,1代表正在访问但是还未回溯到该点,-1代表访问结束。遍历所有点,如果未访问过,则以该点进行DFS。如果此点已经访问结束,直接返回;如果此点正在访问还未回溯,设置失败跳出;如果此点未访问过,设置状态为正在访问还未回溯,遍原创 2022-02-21 23:28:07 · 177 阅读 · 0 评论 -
leetcode——【接雨水问题】
题目思路动态规划每一个位置能够达到的最大高度等于两边最大高度的最小值,则可以通过动态规划得到每个位置两边的最大值,然后求得结果。单调栈将每个pos依次进栈,当待进栈元素大于栈顶元素并且栈不为空是时,出栈并计算当前情况的得到的雨水值。双指针设置left_max和right_max,left和right,如果left_max大的话,移动right,每步移动计算每步雨水值;反之left移动,同样每步移动计算每步的雨水值。实现动态规划class Solution {public: i原创 2022-02-21 11:12:48 · 7536 阅读 · 0 评论 -
leetcode——【蔡锷公式】
题目给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。示例 1:输入:day = 31, month = 8, year = 2019输出:“Saturday”示例 2:输入:day = 18, month = 7, ye原创 2022-02-19 20:29:41 · 126 阅读 · 0 评论 -
leetcode——【合并K个排序链表】
合并k个排序链表合并两个ListNode* mergeTwoLists(ListNode *a, ListNode *b) { if ((!a) || (!b)) return a ? a : b; ListNode head, *tail = &head, *aPtr = a, *bPtr = b; while (aPtr && bPtr) { if (aPtr->val < bPtr->val) {原创 2022-02-19 12:34:01 · 92 阅读 · 0 评论 -
leetcode——【前导0和二进制1个数】
前导0和二进制1个数 int length(int num) { int ret = 0; if (num >> 16 == 0) { ret += 16; num <<= 16; } if (num >> 24 == 0) { ret += 8; num <<= 8; }原创 2022-02-12 03:55:33 · 6118 阅读 · 0 评论 -
leetcode——【石子游戏IV(博弈类)】
题目思路石头可简化为价值为0,1, 2的情况,对于价值为0的石头,可做如下简化:1. 如果0的个数为偶数,等于价值0个数为0的情况;2. 如果0的个数为奇数,等于价值0个数为1的情况。对于价值为1和2的石头,可以简化为两种情况:1. A首先移除了1,那么B只能移除1,之后A只能移除2,B只能移除1;2. A首先移除了2,那么B只能移除2,之后A只能移除1,B只能移除2。因此可以得到算法策略:如果第一种情况,A获胜:1恰好有一个,2至少有一个;1至少有两个,并且小于等于2的个数;即原创 2022-01-26 16:54:56 · 2533 阅读 · 0 评论 -
leetcode——【猫和老鼠】
题目思路博弈问题这道题是博弈问题,猫和老鼠都按照最优策略参与游戏。在阐述具体解法之前,首先介绍博弈问题中的三个概念:必胜状态、必败状态与必和状态。对于特定状态,如果游戏已经结束,则根据结束时的状态决定必胜状态、必败状态与必和状态。如果分出胜负,则该特定状态对于获胜方为必胜状态,对于落败方为必败状态。如果是平局,则该特定状态对于双方都为必和状态。从特定状态开始,如果存在一种操作将状态变成必败状态,则当前玩家可以选择该操作,将必败状态留给对方玩家,因此该特定状态对于当前玩家为必胜状态。从特定原创 2022-01-26 15:55:30 · 303 阅读 · 0 评论 -
leetcode——【格雷码】
题目格雷码和二进制转换实现思路格雷码到二进制二进制到格雷码实现格雷码到二进制二进制到格雷码原创 2022-01-20 17:14:06 · 62 阅读 · 0 评论 -
leetcode——【快速幂算法】
题目快速幂实现思路递归循环实现int qpow(int a, int n){ if (n == 0) return 1; else if (n % 2 == 1) return qpow(a, n - 1) * a; else { int temp = qpow(a, n / 2); return temp * temp; }}//非递归快速幂int qpow(int a, in原创 2022-01-19 20:17:19 · 2146 阅读 · 0 评论 -
leetcode——【逃离大迷宫】
题目思路方法一:有限步数的BFS对于空间中一点,n个障碍点在最理想的情况下最多可包围n(n-1)/2个点,因此可得到思路:1.对起点进行广度优先搜索,在n(n-1)/2点内找到了终点,则返回true;若遍历的点小于n(n-1)/2,则返回false;若在n(n-1)/2点内未找到终点,进行下一步;2.对终点进行广度优先搜索,在n(n-1)/2点内找到了起点,则返回true;若遍历的点小于n(n-1)/2,则返回false;若在n(n-1)/2点内未找到起点,返回true。方法二:离散化+BFS原创 2022-01-12 19:14:19 · 186 阅读 · 0 评论 -
leetcode——【pair<>hash实现】
auto hash_fn = [fn = hash<long long>()](const pair<int, int>& o)->size_t { auto& x = o; return fn((long long)x.first << 20 | x.second); };原创 2022-01-12 14:03:43 · 472 阅读 · 0 评论 -
leetcode——【第k个最小的素数分数】
题目思路长度为n的数组,会有n(n-1)/2个不同的分数,其中可分为n-1组,其长度为1, 2, 3, 4, 5…n的每组均有明确的大小关系,即其可分为n-1组有序列表,问题便简化为n-1个有序列表的合并问题。暴力排序将n(n-1)/2个分数都存入数组,然后利用sort函数并自定义其排序的函数,得到排序后的结果,然后输出第k个即完成。class Solution {public: vector<int> kthSmallestPrimeFraction(vector<原创 2021-12-10 15:23:59 · 381 阅读 · 0 评论 -
leetcode——【三个无重叠子数组的最大和】
题目思路1.暴力遍历首先求得位置poi的k项和数组,数组长度为nums的length-k+1 sum_arr[0] = accumulate(nums.begin(), nums.begin() + k, 0); for (int i = 1; i < sum_arr.size(); ++i) sum_arr[i] = sum_arr[i - 1] - nums[i - 1] + nums[i + k - 1];然后进行三层遍历,第n层遍历第n/3个子数组的起始位置,暴力遍历原创 2021-12-08 21:01:18 · 3458 阅读 · 0 评论 -
leetcode——【k次取反后最大化数组和】
题目思路贪心算法:策略为负数尽可能改为正数,当负数全部更改完仍有取反次数没有用完,这时不得不把正数改回去,值得注意的是,选择最小的正数进行修改时,前面取反得到的正数仍然参与选择。首先进行排序,以k为界限,从小到大进行负转正,若负数用完后k值仍大于0且为奇数,意味着必须有一个非负数进行一次转换或者将一个由负数转换而成的正数转换回去。排序因为其范围较小,可采用哈希表统计个数,遍历数字范围代替排序。或者采用小堆优先队列直接完成。算法实现class Solution {public: int la原创 2021-12-08 11:41:34 · 339 阅读 · 0 评论 -
leetcode——【超级次方】
题目思路快速幂算法:倒序遍历:秦九韶法:算法实现class Solution { const int MOD = 1337; int pow(int x, int n) { int res = 1; while (n) { if (n % 2) { res = (long) res * x % MOD; } x = (long) x *原创 2021-12-07 16:09:16 · 57 阅读 · 0 评论