刷题点滴
叩钉吧zz
不做没感情的复制粘贴侠
展开
-
【刷题】hash妙用:将两个值映射为唯一状态标识
在这个问题中,使用 hash 方法将状态数组 [remain_x, remain_y] 映射为一个长整数,用于在 seen 中查找。质数的选择: 选择一个合适的质数作为哈希函数的乘法因子,可以提高哈希函数的散列性,降低冲突的概率。在这个问题中,选择 1000001 是为了确保足够大,避免发生溢出,并提高哈希函数的唯一性。唯一标识状态: 在搜索问题中,使用哈希可以唯一标识当前状态,避免重复计算,提高算法效率。在这个问题中,使用哈希集合 seen 记录已访问过的状态,避免重复访问相同的状态。原创 2024-01-28 21:22:27 · 403 阅读 · 0 评论 -
【刷题】栈类型总结
栈1. 利用栈的特点,无规律2. 单调栈问题2.1 84 直方图最大矩阵 使用暴力解法,i,j。判断i, j之间的面积(暴力的话,宽度确定)确定是否是完全单调:发现相等的情况,也必须pop,因为第二次是从右往左筛查,需要得到下一个比他小的节点的index.因此左侧不能够出现和他长度相等的节点。需要重视的点:判断是否为完全单调,碰到相等的,是保留最左端的还是最右端的。因为保留的事最右端的,因此通过top的上一个矩阵的index值获得矩阵width,因此矩阵的width需要先po原创 2021-11-18 15:53:36 · 99 阅读 · 0 评论 -
【刷题】路径总和 III的思路历程
【题目】437. 路径总和 III给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。方法1递归可以类似dp一样的考虑。定义 rootSum(p,val) 表示以节点 p 为起点向下且满足路径总和为 val 的路径数目// 本身复杂度O(n)int rootSum(TreeNode* root, int原创 2021-09-28 11:31:32 · 144 阅读 · 1 评论 -
【刷题】字符串部分总结
用到的数据结构参考数组。字符串一般都只会包含26个英文字母。可以使用一个长度为26的数组根据下标0-25的value值 对应 a-z个字符在字符串中出现的次数。栈。针对括号匹配、路径拆分等字符串题目,哈希。哈希表在字符串中也是有一定地位的,我们在解题时可以使用哈希表快速完成一些匹配的关系,比如罗马数字转整数中的循环比较队列。枚举的方式;电话号码的字母组合题型总结1. 使用数组的方法数组有两个方法:双指针和前缀和。可以使用双指针中的滑动窗口。1.1【例题】 字符串的排列原创 2021-09-11 16:31:02 · 105 阅读 · 0 评论 -
【刷题】数组部分总结
首尾指针:范围查找,比如二分搜索等滑动窗口:指针处在数组同一方向,根据条件移动左右指针,用于获取范围和等快慢指针: 多用于链表计算时,判断是否有环等滑动窗口和大于等于 target 的最短子数组问题特质:连续片段(尽量不用动态规划,用一个total就可以记录)解题方法:专门设置有left, right, total等复杂度:O(n)乘积小于 K 的子数组这个题和上一个的区别是要计算,这样的数组出现的个数前缀和问题特质:连续片段[i][j]之间的和可以用前缀d原创 2021-09-10 10:05:38 · 82 阅读 · 2 评论 -
STL部分函数
vector pre;lower_boundlower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。lower_bound(pre.begin(), pre.end(), x)头文件:#include <algorithm> std::lower_bound, std::upper_bound, s原创 2021-08-30 10:13:33 · 103 阅读 · 0 评论 -
【c++】vector的几种初始化方法
vector(1): vector<int> list;(2): vector<int> ilist2(ilist);vector<int> ilist2 = ilist; (3): vector<int> ilist = {1,2,3.0,4,5,6,7}; vector<int> ilist {1,2,3.0,4,5,6,7}; (4): vector<int> ilist3(ilist.begin()+2,原创 2021-08-29 15:55:32 · 200 阅读 · 0 评论 -
【算法】前缀和总结
精髓用数学的方法题目1915.最美字符串560.和为 K 的子数组930.和相同的二元子数组974.和可被 K 整除的子数组1371.每个元音包含偶数次的最长子字符串1542.找出最长的超赞子字符串1590.使数组和能被 P 整除前缀和:只要是连续的数组,都可以使用前缀和的方式,来减少一个维度的便利(使连续)560前缀和的根本原因:由于需要求的是任意 sum(i,j)的和,如果便利i, j则复杂度为平方。因此考虑使用和的方式: s(i,j)= total(j) - total(原创 2021-08-29 15:53:43 · 123 阅读 · 0 评论 -
【c++】string, int转换
string -> integer方法1string a = "123";int b = stoi(a);方法2string str = "123";int integer;stringstream ss;ss << str;ss >> integer;string <- integer方法1.int c = 123;string d = to_string(c)方法2.//invert integer to stringint in原创 2021-08-29 15:50:47 · 59 阅读 · 0 评论 -
【c++】priority queue
实现方法用的是堆来实现的priority queue,每次插入和删除都要使用上悬和下沉堆使用一个数组实现的,因为是标准的二叉树子节点index就是 2i and 2i+1使用方法priority_queue<>priority_queue<Type, Container, Functional>Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是ve原创 2021-08-29 15:49:07 · 70 阅读 · 0 评论 -
【状压】暴力枚举集合
一般需要枚举所有集合, 且是暴力的方法,则范围会很小,不能超过20。状态压缩:状态压缩,其实就是将每个任务 task[i] 看作某个 「 十进制数字 」 的二进制上的第 i 位,1 表示该任务被选择,反之不被选择。用二进制表示集合对于集合的子集,可以用(i|j)=j,则i是j的子集这样,对于所有种集合的组成情况,可以用二进制方法方便遍历:一共有1<<k种。k=元素个数枚举所有子集// 枚举所有子集for(int i =0;i<m;i++){ // 例如i:110.原创 2021-08-29 15:47:15 · 189 阅读 · 0 评论 -
动态规划总结——《程序员代码面试指南》读笔
判断方法暴力能否转换成动态规划:判断是否是 无后效性的: 递归状态的返回值与怎么到达这个状态的路径无关,(面试一般多是)做题步骤尝试的方法:方程的思想:尽量用数组来表示结果举例子,来实现数组操作更新的某一步:从i到i+1写出相应暴力的方法画图,把暴力化成动态规划(使用代码的角度更容易查看如何化解)暴力转动规的规范化步骤:找到参数:哪些参数定下来,返回值就确定了把可变参数的所有组合变成一张表,1个参数是1维,两个是2维表中标出最终答案,base case填表填好之后就知道原创 2021-08-18 09:52:42 · 221 阅读 · 5 评论 -
C++读一行中多个字符串
// getlin(cin, line)while(getline(cin,line)) { string x; flag1++; flag2=0; stringstream ss(line); while(ss>>x) { cout<<x<<' '; flag2++; t[flag1][flag2]=x; } cout<<endl; }原创 2021-06-14 15:42:02 · 607 阅读 · 0 评论 -
【算法】【k-d tree】【局部敏感hash】
K-d tree:定义:每个非叶子结点都可以看作隐含的分割超平面作用:used to solve the problem of knn(o(n)) 找到距离某个点最近的一些点, a kinds of k dimension tree构建方法:分别用x y 轴切割(利用中位数)k-d 上的knn实现:步骤:先走到叶子结点,往上走,碰到有左右子树,则判断最长的点和距离边界的距离,如果边界距离更小,则进入到另一个子树进行相应的递归操作。局部敏感hash[Algorithm] 局部敏感哈希算法原创 2021-05-18 16:23:17 · 112 阅读 · 0 评论 -
C++溢出总结
最近在做leetcode整数反转的题,让判断integer是否溢出。查了一些资料,做一些溢出判断总结:1. 设置一个long型变量存储结果。判断 是否< INT_MIN 或者 > INT_MAX。2. 保持使用int, 乘 加 之前判断是否溢出if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;if (rev < INT_MIN/10 || (rev =..原创 2020-10-04 20:29:27 · 3033 阅读 · 1 评论 -
最长字符串 思路
通过查看了几个微博,发现用两个指针,左指针和右指针来代表长度。原因有一下几点: 右指针每次遍历时,一定向后移动一位。一旦移动到最后一位,就代表识别结束。 左指针在向右的移动过程,是一旦找到 右指针所指的元素t 在子串中的位置i出现时,就把左指针直接知道i+1的位置 注意的点:当字符串长度为0或1时,需要考虑。但这样执行用时和内存消耗很高。...原创 2020-09-27 21:37:14 · 121 阅读 · 1 评论 -
指针单向链表的遍历添加方法
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };对于这种单向结构的指针链表,依次遍历添加,然后返回头节点。有两种方法。1. 非递归设置一个头指针head 和移动指针h.ListNode head= new ListNode(0); // 头指针ListNode h= head; // 移动指针...h..原创 2020-09-21 10:30:15 · 222 阅读 · 0 评论 -
sizeof,length和size()的区别
今天c++上刷题,很简单的一个题,卡在了计算vector<int>的长度这一步。sizeof(vector) 和 vector.size() 得到的结果不一样,于是学习了下基础。1. sizeof() 是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。( sizeof()运算符用来求对象所占内存空间的大小。)举例1.1//在 windows中sizeof(char)=1 sizeof(int)=4原创 2020-09-20 16:17:49 · 1105 阅读 · 0 评论