文章分类 -  算法巧解

刷题的时候遇到的一些很巧妙的解法
摘要:原题在这里: 概述:给定两个字符串s,t,问在s中能构成t串的数量(不同下标则不同构造)。 analyse: 记忆化搜索+剪枝: 定义s,t串长度为n,m 定义dfs(u,v):表示在s[i,n)内查找t[v]字符 剪枝:因为需要保证s串剩余字符长度满足后续t串的匹配,就一个遍历优化: 在s[u,n 阅读全文
posted @ 2022-04-10 16:26 Renhr 阅读(34) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给定u,v和x,y,问能否通过(u+v,v)or(u,u+v)到达(x,y)。 analyse: 正向搜索肯定是不能的,逆向就很轻松了。 有规律的是: x>y,那么上一步肯定是(x-y,y) x<y,那么上一步肯定是(x,y-x) 特别的,如果有很多连续相同的操作,那么可以优 阅读全文
posted @ 2022-04-09 15:37 Renhr 阅读(28) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:在给定01矩阵中,找最大的1构成的矩阵的面积。 1.my_way,爆搜+剪枝过了。 analyse: 定义mp[i][j]表示原矩阵[0~i][0~j]区间内的1数量 那么当两点(i,j),(u,v)(u>=i,v>=j)有mp关系: mp[u][v] - mp[u][j] 阅读全文
posted @ 2022-04-08 20:48 Renhr 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题在这里 概述题意:给一个区间,问区间内有多少个数字的二进制有效位数是质数。 1.因为数据合适,所以直接暴力: class Solution { public: int countPrimeSetBits(int left, int right) { /* 2,3,5,7,11,13 */ int 阅读全文
posted @ 2022-04-05 13:37 Renhr 阅读(152) 评论(0) 推荐(0) 编辑
摘要:原题在这里: copy题目: 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。 '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。 1.常规记忆化搜索+特定剪枝 analyse: 当前为x,y 阅读全文
posted @ 2022-04-04 15:14 Renhr 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:给定数组,在相对顺序不变的情况下将所有0置于数组末尾。 analyse: 1.选用vector的erase和emplace_back配合使用 class Solution { public: void moveZeroes(vector<int> &nums) { int n 阅读全文
posted @ 2022-04-04 14:12 Renhr 阅读(26) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述: 给定4位和6位二进制位,分别用于表示数字[0,11],[0,59],问有n位二进制生效时候所表示的时间字符串数组。 analyse: 1.直接思路就是dfs暴力构造了,但是这就增加了本题的难度,但是我还是写出来了,问题不大。 code: class Solution { vec 阅读全文
posted @ 2022-04-02 14:27 Renhr 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述: 给定一个二叉树的根节点,要求转换为任意字符串,后将该字符串还原二叉树的结构。 硬核手撸: struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NUL 阅读全文
posted @ 2022-04-01 15:56 Renhr 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述: 就是原字符串s,和s重排字符串t,会在t字符串中添加一个字符,找出这个字符。 很简单的水题,但是有三种解法,都是线性最佳解法,在我解题的时候想到了其中一种就没想到其他了,算很好的思维拓展。 code: class Solution { public: char findTheD 阅读全文
posted @ 2022-04-01 14:38 Renhr 阅读(624) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 本来是个水题,但是因为负数取补码计算就学到了东西。 code: class Solution { string ch = "0123456789abcdef"; string mk(long x) { if (x < 1) return ""; return mk(x / 16) + 阅读全文
posted @ 2022-04-01 13:55 Renhr 阅读(4) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:一个含两种字符的字符串,问在可修改k个以内字符情况下,最长同种字符长度。 滑动窗口真的绝了: 甚至我还思考了一下为什么不过滤一下窗口中间的最大值,因为是滑动维护。 class Solution { //只要窗口中有任何一个字符出现次数不超过 k,那么这个窗口就是合法的 pub 阅读全文
posted @ 2022-03-31 22:28 Renhr 阅读(62) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述:求区间内所有数字的与运算和 analyse: 因为数据范围是INt_MAX,所以不可能暴力,必须研究数学规律。 mine_直接说了,考虑二进制的每一位,范围为[0,left],当区间端点&y都等于y,且区间长度小于y,那么一定有y。 还有更优解法,但是暂时搁置一下。 code: 阅读全文
posted @ 2022-03-31 12:23 Renhr 阅读(149) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 经典题目就不多说题意了 1.记忆化广搜 code: class Solution { struct ii { int x, y; ii(int a, int b) : x(a), y(b) {} friend bool operator<(ii a, ii b) { return a. 阅读全文
posted @ 2022-03-30 20:29 Renhr 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 给定一个长度为[1,1e4]区间内的数组,求第三大数字(不足三则取最大) 然后我wa+wa+wa..... 很无语。。。 算法复杂度为O(2*N),第一遍找最小,然后三个数维护第三大 满足有效更新为(x^y&&y^z)也即xyz三者不互相同,则为z,否则为x code: class S 阅读全文
posted @ 2022-03-30 17:35 Renhr 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:求n范围内的数字中,数字1的个数。 analyse: 我起初做这个题的时候,也是考虑的从每一位数字上去分析这个位能给ans提供多少个1,但终究是太nen了,想得稀奇古怪,不过最后还是瞎捣鼓4小时以后还是ac了,虽然写得很混乱,人也没忍住我老是写错我想要的逻辑,写完连题解都不想 阅读全文
posted @ 2022-03-29 17:04 Renhr 阅读(56) 评论(0) 推荐(0) 编辑
摘要:原题在这里。 学习链接在这里。 analyse: 我构思了很久,只能想到用bfs是最好的,但是并不能想到具体每一个变换是怎么处理的(头大) 因为打算系统化学习动态规划篇章,所以现在暂时只学习了一个最简单动态规划版本,是理解了,确实非常巧妙,惊叹ing code: class Solution { p 阅读全文
posted @ 2022-03-28 22:27 Renhr 阅读(24) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意: 给定一个可能有环的链表,如果有环则返回第一个环节点,否则null 低配hash处理: class Solution { map<ListNode *, int> mp; public: ListNode *detectCycle(ListNode *head) { if ( 阅读全文
posted @ 2022-03-28 11:08 Renhr 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题在这里(简版题两两交换在这里) 概述题意: 要求k个为一组翻转链表,且不能是直接修改链表的值,必须改动节点。 1.非要求算法,写了个 k个节点为一次递归调用的函数 class Solution { int num, pd; queue<int> q; queue<ListNode *> st; 阅读全文
posted @ 2022-03-25 18:08 Renhr 阅读(34) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意: 给定数组中,求满足和>=target的子数组的最小数组长度。 1.暴力是不可能暴力的,再怎么说都是维护dp[i]=nums[i,r] class Solution { public: int minSubArrayLen(int target, vector<int> &n 阅读全文
posted @ 2022-03-24 15:41 Renhr 阅读(21) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:给定数字n,在数字范围[1,n]中,找到根据字典序的第K小数字。 我首先想到的是构造,然后构造构造着就变成了dfs暴力(指严严实实地从第1小找到第k小) 然后因为1<=k<=n<=1e9,所以T了,然后就是考虑剪枝优化 因为时间关系就没考虑怎么剪枝了,直接看了题解,下次再做吧 阅读全文
posted @ 2022-03-23 22:19 Renhr 阅读(53) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示