算法常用技巧
文章平均质量分 50
一打雪碧
这个作者很懒,什么都没留下…
展开
-
在树的遍历中控制格式输出
bool tag = true;void dfs(node* root) { if (root == nullptr) return; dfs(root->lchild); dfs(root->rchild); if (tag) tag = false; // 这个控制格式打印输出厉害了 else printf(" "); printf("%d", root->val);}使用 tag 作为标记,第一次访问到的时候,将 t原创 2022-03-13 11:50:25 · 131 阅读 · 0 评论 -
结构体的初始化
一般在做算法题时,往往需要用结构体来存储下一个具体的对象,比如说,一个学生,有不超过8位的姓名name,16位学号id,int类型的成绩score。则可以使用如下的结构体,并且建立构造函数。struct student{ char name[10],id[20]; int score; student(){}//注意点1 student(char _name[10],char _id[20],int _score){//注意点2 strcpy(name,_原创 2021-02-24 19:56:46 · 294 阅读 · 0 评论 -
拍案叫绝的逻辑
开贴记录刷题过程中,遇到的令我拍案叫绝的解法。1、1071. Greatest Common Divisor of Strings求给定的两个字符串的最大的公共“公约数”。原创 2021-01-19 22:37:53 · 136 阅读 · 0 评论 -
使用C++的transform函数实现string的大小写转换
C++提供了transform函数可以用来实现将string中的字母全部转换为大写或者是小写#include <string>#include<iostream>#include <algorithm>using namespace std;int main(){ string str = "abcdefgHIJKLMN"; //转小写 transform(str.begin(),str.end(),str.原创 2021-01-31 11:14:02 · 2358 阅读 · 3 评论 -
查找给定的数组中的前两大、三大的数
当然最直观的时使用排序,之后输出即可。但是当数据量很大时、或者是算法考试时,这种方法显得很慢。可以在一边遍历中就得到结果。假设数组有解并且含有重复元素,而且数组中可能含有int类型的最小值0x80000000。例题力扣414. 第三大的数本题中,数据限制为可能含有int类型的最小值,可能包含重复元素。class Solution {public: int thirdMax(vector<int>& nums) { if(nums.size()<3)原创 2021-01-30 16:42:21 · 986 阅读 · 0 评论 -
统计当前元素前面有多少元素
算法题中经常会出现一种问题,即统计当前元素前面有多少元素,比如数组cnt{0,1,2,1},其意义为,0出现了0次,1出现了1次,2出现了2次,3出现了1次,即 i 出现了cnt【i】次,那么统计每个元素前面有多少元素,这是一个累加的概念代码如下int temp=0,pre;for(int i=0;i<cnt.size();i++){ pre=cnt[i]; cnt[i]=temp; temp+=pre;}在原数组中进行修改,必须先保存下当前的cnt【i】到pre中原创 2021-01-28 17:02:29 · 207 阅读 · 0 评论 -
反向思维
在思考时,有时候,直接按照题目要求去做、去模拟,可能是非常复杂,甚至是没有解的,可以试一下反向思维。1、1640. 能否连接形成数组反向思考,如果pieces能够拼接为arr,那么一定是每一个pieces【i】都是arr的一部分。所以记录arr中每个元素的位置,之后遍历pieces,对于每个pieces【i】,找到其第一个元素即pieces[i][0]在arr中的出现位置,之后先对比在arr中,包括该元素在内,直到arr的end(),元素的个数是否大于pieces[i].size(),如果是,继续比较原创 2021-01-24 17:30:28 · 193 阅读 · 0 评论 -
关于unordered_map
unordered_map是非常常用也非常实用的一个建立映射的容器。当我们要用来标记某个基本类型是否出现过时,可以使用unordered_map < typename,bool >这样就建立了一个基本类型到bool型的映射,如果一开始建立之后,默认任何typename类型都是没有出现过的,即任何typename的映射结果都是false。同样可以建立unordered_map<typename,int> ,即建立基本类型到int的映射,重要的是,默认任何int型的数据的一开始的映射原创 2021-01-24 12:11:56 · 284 阅读 · 0 评论 -
结构体的排序函数以及priority_queue优先级、自定义的结构体struct作为关联性容器map、unordered_map的key
作为map的keymap是有序的,其中的插入元素按照key的大小进行排序,对于一般的数据类型,比如说int、string这两种常用的类型来说,可以直接作为map的key使用,但是对于自定义的struct结构体来说,就不可以直接使用其作为key进行插入,这是因为,编译时,无法进行比较大小。具体原理不赘述。如果想使用自定义的struct作为key,可以这么修改。#include <iostream>#include <map>using namespace std;str原创 2021-01-21 21:11:59 · 438 阅读 · 0 评论 -
在读入数据同时,就将数据分类
这是一个非常实用的技巧。在pat平台这种需要自己读入给定的数据时,可以边读入边将数据分类。在LeetCode这种已经将数据读入,这需要自己处理的平台,在遍历数据时,直接按照题目要求,将数据分类,可以大大减少思考量。例题937. 重新排列日志文件,这道题挺恶心的,英文题意是在是没有读懂。题意是要求将数据进行排序,数据分为两类,敏感!敏感!!数据有分类的需要,分为数字、字符两类,而且要求,原来数据中数字日志要按照原来顺序,可以在遍历给定的数据时,遇到数字日志就将数字日志保存下来,这样,数字日志就自动按照原创 2021-01-19 21:25:15 · 167 阅读 · 0 评论 -
涉及数组奇数位、偶数位的问题&&数据终极状态问题
有一类问题很巧,这类问题涉及到在原数组的奇数位、偶数位之间来回移动数据,类似题目有力扣893. Groups of Special-Equivalent Strings与力扣1217. Minimum Cost to Move Chips to The Same Position巧在什么地方呢,先看1217题,这道题说的是,每个位置上都有一些物品,而每个物品移动一个位置,代价是1,移动两个位置,代价是0。也就是说,i位置上的物品,移动到i+2或者i-2位置上时,是不需要任何代价的,当然前提是,数组不越界。原创 2021-01-19 20:20:23 · 481 阅读 · 0 评论 -
字符串hash
做力扣859. Buddy Strings时,在使用字符串hash统计单个字符的出现次数时int cnt[256]={0};for(int i=0;i<a.size();i++){ cnt[a[i]]++; if(cnt[i]>1) return true;}在if(cnt[i]>1)处出错,应该是if(cnt[a[i]]>1),即应该是如果字符a[i]出现的次数大于1,就可以返回true但是,却写成了cnt[i]>1,这是非常低级的错误。结论,使原创 2021-01-19 19:25:26 · 95 阅读 · 0 评论 -
分割字符串以及istringstream提取空格分隔的string类型的单词
如何分割给定的一行string中的单词字符串算法题中经常会出现一种题型,即给定一行字符串,要分割出一整个串中的单词,当然串中是有字母、空格、标点符号。比如Bob hit a ball, the hit BALL flew far after it was hit.该串字符串,将大写字母替换为相应的小写字母后,单词有bob、hit、a、ball、the、flew、far、after、it、was。如何分割,当然了这种分割是在给的已经是一个整串,而不是在输入时分割,如果是输入时分割,则可以使用cin以原创 2021-01-19 16:58:55 · 1067 阅读 · 0 评论