Featured image of post 算法学习tips

算法学习tips

记录算法学习中的一些tips

速度优化

    1. cin好像比scanf慢
    1. memset(f, -1, sizeof(int)*41); 用于初始化数组
1
void *memset(void *s, int ch, size_t n);
    1. 大问题拆成小问题,可以通过提前把小问题分别算出来,最后再合成大问题的解,相比直接将每次的大问题拆成小问题计算更好

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#include <iostream>
#include <algorithm>
using namespace std;

int a[200005];
long long sum[200005];
long long sum1[200005];
long long sum2[200005];

int main()
{
	int n;
	long long min=0,max=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	min=0;
	sum1[1]=min;
	for(int i=2;i<=n;i++)
	{
		if(sum[i-1]<min)
			min=sum[i-1];
		sum1[i]=min;
	//	cout<<"min"<<min;
	}
	
	max=sum[n];
	sum2[n]=max;
	for(int i=n-1;i>=1;i--)
	{	
		if(sum[i]>max)
			max=sum[i];
		sum2[i]=max;
	//	cout<<"max"<<max; 
	}
	
	for(int i=1;i<=n;i++)
	{
		printf("%lld ",sum2[i]-sum1[i]);
	}
	
	return 0;
 } 

 
 
    1. 记忆化搜索:搜索时创建数组或者其他数据结构,用来存储已经计算过的结果或已经搜索过的,避免重复计算

崩溃bug

    1. 有+1 -1 数组大小记得多设点数组大小,别g了,不差那点
    1. 大数组的定义,不要定义在main函数内部,会导致栈溢出
    1. 二分查找——二分答案很多时候题目会让你去求解一个 ans ,这个 ans 有以下一些特征。比如求一个满足条件 A 的最大值/最 小值;或者求一个最大的最小值/最小的最大值,并且我们直接求解答案 A 非常困难,并且 ans 满足单调性,那么我们不妨直接二分查找最后的答案,测试它是不是满足条件。这种直接二分最后答案的算法就叫二分答案 。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

#include <iostream>
#include <algorithm>
using namespace std;

int xp[1005][1005];
bool xpp[1005][1005];
int p[6]={0,-1,0,1,0};
int q[6]={0,0,-1,0,1};
int m,n;
void func(int y,int x);
int main()
{
	int f=0;
	char t;
	scanf("%d %d",&n,&m);
	getchar();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			t=getchar();
			if(t=='*')
			{
				xp[i][j]=1;
			}	
			else
			{
				xp[i][j]=0;				
			}	
		}	
		getchar();	
	}
	
	
	func(0,0);
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(xp[i][j]==1&&xpp[i][j]!=true)
			{
				printf("*");
			}	
			else
			{
				printf(".");		
			}	
		}
		printf("\n");		
	}	
	
	
	return 0;
 } 
 
 void func(int y,int x)
 {
	if(x<0||y<0||x>m+1||y>n+1||xpp[y][x]==true)
	{
		return;
	}
 	if(xp[y][x]==1)
 	{
 		xpp[y][x]=true;
 		return;
	 }
	 xpp[y][x]=true;

	 for(int i=1;i<=4;i++)
	 {
	 	func(y+p[i],x+q[i]);

	 }
	return;
 }

代码模板

1.随机数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {
	int a=1000;
	srand(time(0));
	while(a--)
	{
	cout<<rand()%10<<endl;//生成0-9的随机数
	 } 

    return 0;
}

字符串处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <string>

//字符串构造

string s1 = "hello";
string s2 = s1; // s2 = "hello"
string s2(10, 'c'); // s2 = "cccccccccc"
string s3(s1); // s3 = "hello"
string s4(s1, 1, 3); // s4 = "ell"


//获取字符串长度

string s = "hello";
int len = s.size(); // len = 5
int len2 = s.length(); // len2 = 5

//字符串拼接

string s1 = "hello";
string s2 = "world";
string s3 = s1 + s2; // s3 = "helloworld"
string s4 = s1 + " " + s2; // s4 = "hello world"
s1 += s2; // s1 = "helloworld"
s1.append(s2); // s1 = "helloworld"
s1.append("world"); // s1 = "helloworldworld"
s1.append(3, 'c'); // s1 = "helloworldccc"

//字符串比较
str1 == str2 //判断两个字符串是否相等
str1 > str2 //判断str1中第一个不匹配的字符比str2中对应字符大,或者所有字符都匹配但是比较字符串比源字符串长。

//获取子串
string str("Hello,World!");
string subStr = str.substr(3,5); // subStr = "lo,Wo"

//访问字符串中的字符
string str("Hello,World!");
char c = str[0]; // c = 'H'
char c2 = str.at(0); // c2 = 'H'

//查找字符串

find()函数返回字符串中第一个匹配的位置,如果没有找到则返回string::npos
rfind()函数返回字符串中最后一个匹配的位置,如果没有找到则返回string::npos

string str("Hello,World!");	
int pos = str.find("World"); // pos = 6
int pos2 = str.find("World", 7); // 从第7个字符开始查找,pos2 = string::npos
int pos3 = str.find("World", 7, 3); // 从第7个字符开始查找,最多查找3个字符,pos3 = string::npos

find_first_of()函数返回字符串中第一个匹配的位置,如果没有找到则返回string::npos
find_last_of()函数返回字符串中最后一个匹配的位置,如果没有找到则返回string::npos
find_first_not_of()函数返回字符串中第一个不匹配的位置,如果没有找到则返回string::npos
find_last_not_of()函数返回字符串中最后一个不匹配的位置,如果没有找到则返回string::npos


//插入删除字符串

string&insert(size_t posconst string&str);   // 在位置 pos 处插入字符串 str
string&insert(size_t posconst string&strsize_t subpossize_t sublen); // 在位置 pos 处插入字符串 str 的从位置 subpos 处开始的 sublen 个字符
string&insert(size_t posconst char * s);    // 在位置 pos 处插入字符串 s
string&insert(size_t posconst char * ssize_t n); // 在位置 pos 处插入字符串 s 的前 n 个字符
string&insert(size_t possize_t nchar c);      // 在位置 pos 处插入 n 个字符 c
iterator insert(const_iterator p, size_t n, char c); // 在 p 处插入 n 个字符 c,并返回插入后迭代器的位置
iterator insert (const_iterator p, char c);       // 在 p 处插入字符 c,并返回插入后迭代器的位置

string& erase (size_t pos = 0, size_t len = npos);   // 删除从 pos 处开始的 n 个字符
 
iterator erase (const_iterator p);            // 删除 p 处的一个字符,并返回删除后迭代器的位置
 
iterator erase (const_iterator first, const_iterator last); // 删除从 first 到 last 之间的字符,并返回删除后迭代器的位置

// 其他

getline(cin, s); // 从输入流中读取一行字符串
stoi(s); // 将字符串转换为整数
str.empty(); // 判断字符串是否为空
str.swap(str2); // 交换两个字符串的内容
潇洒人间一键仙
使用 Hugo 构建
主题 StackJimmy 设计
  1. 1 catallena 橘子焦糖
  2. 2 CityOfStars RyanGosling,EmmaStone
  3. 3 DontLookBack Kotomi,RyanElder
  4. 4 Escape(ThePinaColadaSong) RupertHolmes
  5. 5 freeLoop DanielPowter
  6. 6 Happy PharrellWilliams
  7. 7 ITookAPillInlbiza(SeeBRemix) MikePosner,SeeB
  8. 8 LastChristmas TaylorSwift
  9. 9 Monica(Live) 张国荣
  10. 10 PhantomLimb YellowMellow
  11. 11 SayHello RosieThomas,SufjanStevens
  12. 12 SeeTinh HoàngThùyLinh
  13. 13 Sugar Maroon5
  14. 14 TheEndOfTheWorld SkeeterDavis
  15. 15 YehHuaDam(AkaLookattheOwl) Darkie
  16. 16 一笑江湖 (DJ弹鼓版) 闻人听書_
  17. 17 万水千山总是情 汪明荃
  18. 18 不可能错过你 王力宏
  19. 19 不该 周杰伦,张惠妹
  20. 20 不谓侠 萧忆情Alex
  21. 21 偏偏喜欢你 陈百强
  22. 22 偏爱 张芸京
  23. 23 兰亭序 周杰伦
  24. 24 再见 张震岳
  25. 25 千千阙歌 张国荣
  26. 26 千层套路 中村千寻
  27. 27 半点心 草蜢
  28. 28 单车 陈奕迅
  29. 29 南屏晚钟 徐小凤
  30. 30 只要平凡 张杰,张碧晨
  31. 31 可不可以 季彦霖
  32. 32 可不可以 张紫豪
  33. 33 吉他初恋 刘大壮
  34. 34 同桌的你 老狼
  35. 35 国际歌 唐朝
  36. 36 处处吻 杨千嬅
  37. 37 夜的第七章 周杰伦
  38. 38 失恋 草蜢
  39. 39 富士山下 陈奕迅
  40. 40 带我去找夜生活 告五人
  41. 41 弱水三千 石头&张晓棠
  42. 42 忘记时间 胡歌
  43. 43 恋爱循环 花泽香菜
  44. 44 改变自己 王力宏
  45. 45 敢爱敢做 林子祥
  46. 46 日不落 蔡依林
  47. 47 晚风心里吹 李克勤
  48. 48 最爱 周慧敏
  49. 49 月半小夜曲 名知玲美
  50. 50 月半小夜曲 李克勤
  51. 51 梦里水乡 江珊
  52. 52 歌唱社会主义祖国 any
  53. 53 每段路 吕方
  54. 54 沉默是金 张国荣
  55. 55 沧海一声笑 许冠杰
  56. 56 海阔天空 Beyond
  57. 57 满分情人 刘小慧
  58. 58 漠河舞厅 柳爽
  59. 59 漫步人生路 邓丽君
  60. 60 爱丫爱丫 BY2
  61. 61 爱人错过 告五人
  62. 62 爱你 王心凌
  63. 63 皇后大道东 罗大佑
  64. 64 破茧 张韶涵
  65. 65 秒针 阿梨粤
  66. 66 童年 罗大佑
  67. 67 素颜 许嵩,何曼婷
  68. 68 红日 李克勤
  69. 69 让一切随风 钟镇涛
  70. 70 讲不出再见 谭咏麟
  71. 71 诉衷肠 多亮
  72. 72 跳舞街 陈慧娴
单车 - 陈奕迅
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 黄伟文

作曲 : 柳重言

编曲 : 柳重言

不要不要假设我知道

一切一切也都是为我而做

为何这么伟大

如此感觉不到

不说一句的爱有多好

只有一次记得实在接触到

骑着单车的我俩

怀紧贴背的拥抱

难离难舍想抱紧些

茫茫人生好像荒野

如孩儿能伏于爸爸的肩膊

谁要下车

难离难舍总有一些

常情如此不可推卸

任世间再冷酷

想起这单车 还有幸福可借

经已给我怎会看不到

虽说演你角色实在有难度

从来虚位以待

何不给个拥抱

想我怎会相信这一套

多痛惜我却不便让我知道

怀念单车给你我

唯一有过的拥抱

难离难舍想抱紧些

茫茫人生好像荒野

如孩儿能伏于爸爸的肩膊

哪怕遥遥长路多斜

你爱我爱多些

让我他朝走得坚壮些

你介意来爱护

又靠谁施舍

难离难舍想抱紧些

茫茫人生好像荒野

如孩儿能伏于爸爸的肩膊

谁要下车

难离难舍总有一些

常情如此不可推卸

任世间怨我坏

可知我只得你 承受我的狂或野