上一篇太长了,所以分开写一下。
65、二维数组的初始化
方法一:最直接和简单
vector<vector<int>> v(n,vector<int>(m));//初始化为n x m的矩阵
(要写在类的函数内)
方法二:先定义,后初始化大小,适用于不方便一开始就找到n,m的情况
vector<vector<int>> v;(可以写在函数外面)
v = vector<vector<int>> (n,vector<int>(m));
66、逗号在两个语句之间
for (int i = 0; i < n; ++i) dfs(M, P, i, 0), dfs(M, A, i, m - 1);
//两个dfs都在for循环内,如果用分号的话就只有一条语句在for循环内
67、字符串相关的一些语法
将字符串转化成数字
string digits = "23456'
int a = digits[0] - '0'; //a为数字2
string s;
s.push_back(a); //尾部插入a
s.pop_back(); //删除尾部数字,c++11的新特性
字符串数组
string letterMap[10] = {"", "", "abc", "def",
"ghi","jkl", "mno", "pqrs", "tuv", "wxyz"};
好久没有学习了,今天是2022年4月6日,要开始学习了。
68、 回文串
“回文串”是一个正读和反读都一样的字符串
69、关联
回溯算法 = 树的深度优先搜索(递归算法) + 剪枝函数
=70、求子串
string str = "abcdefg";
string subStr = str.substr(1, 3);//1为开始位置,3为长度
cout << "subStr = " << subStr << endl; //输出bcd
71、撤回
快捷键 ctra+z
72、语法
for(int i = begin, int j = end; i < j; ++i, --j) //错误
for(int i = begin, j = end; i < j; ++i, --j) //应该这样写
=73、快速注释
1, 先选中要注释的代码段
2,按住ctrl+k+c注释本段代码
3,按住ctrl+k+u取消注释本段代码
74、问题
1、语法,好多语法的细节不会,要多练习.熟能生巧,太久不写代码不行了
2、思路,题目的思路很重要
75、语法
ans.clear();//清空ans容器中的内容
76、插入语法
string s = "abc";
//s.insert(1, "6");//√,输出 a6bc
//s.insert(1, '6');//×,必须要双引号
//s.insert(1, 7, '6');//√a6666666bc
//s.insert(s.begin(), 'p');//对,输出 pabc
s.erase(s.begin() + 1);//对,输出 ac
cout << s << endl;
77、去重代码
for(int i = startIndex; i < nums.size(); ++i)
{
if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false) continue;
//步骤1;关键*****************************
//used[i-1] == false说明同一层不能取一样的
//used[i-1] == true说明同一树枝不能取一样的
path.push_back(nums[i]);
used[i] = true;//步骤2
backTracking(nums, i + 1, used);
used[i] = false;//步骤3
path.pop_back();
}
回溯法去重基本都是这个套路,这种需要有序数组。
另外,如果没法重排的时候,就要用unordered_set来进行去重。
//used[i-1] == false说明同一层不能取一样的
//used[i-1] == true说明同一树枝不能取一样的
78、leetcode第51题目
一、queen皇后是国际象棋中棋力最高的棋子,每步不限制格数,也不限制方向,横向、纵向、斜向都可以。但皇后不可以越过棋子走棋。
二、单词
col、column | 列 |
---|---|
row | 行 |
三、二维棋盘初始化
int n = 8;
std::vector<std::string> chess(n, std::string(n, '.'));
//初始化一个8*8的棋盘
int n = 8;
vector<int> chess(n, 6);
cout << chess[5] << endl;
//将chess初始化为8个6
四、啊啊啊,找了一个小时的错误
chessBoard[row, col]//这样写错误的
chessBoard[row][col]//引用二维数组应该是这样的
79、数组初始化大小
//vector<int> ans; 这样不行,要给出数组有多少个元素
vector<int> ans(nums.size(), 0);
80、map的使用
unordered_map<char, int> symbolTable{
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};
81、leetcode13题目
要找规律,把特殊的融入进一般的流程内部
自己的写法
class Solution {
private:
int sum = 0;
public:
int romanToInt(string s) {
for(int i = 0; i < s.size(); ++i)
{
switch(s[i])
{
case 'I':
if(s[i + 1] == 'V' || s[i + 1] == 'X') sum = sum - 1;
else sum = sum + 1;
break;
case 'V':
sum = sum + 5;
break;
case 'X':
if(s[i + 1] == 'L' || s[i + 1] == 'C') sum = sum - 10;
else sum = sum + 10;
break;
case 'L':
sum = sum + 50;
break;
case 'C':
if(s[i + 1] == 'D' || s[i + 1] == 'M') sum = sum - 100;
else sum = sum + 100;
break;
case 'D':
sum = sum + 500;
break;
case 'M':
sum = sum + 1000;
break;
}
}
return sum;
}
};
官方简短些的写法
class Solution {
private:
int ans = 0;
unordered_map<char, int> symbolTable{
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};
public:
int romanToInt(string s) {
for(int i = 0; i < s.size(); ++i){
if(symbolTable[s[i]] >= symbolTable[s[i + 1]]){
ans += symbolTable[s[i]];
}
else{
ans -= symbolTable[s[i]];
}
}
return ans;
}
};
replace(v.begin(), v.end(), 20,2000);替换,将容器v中上的20替换成2000
82、初始化
一、一维数组
vector<int> c(5);
//数组c包含5个元素
日了,千万别写成,一道题目中出现的错误。
vector<int> c[5]
二、二维数组
vector<vector<int>> dp(m, vector<int>(n, 0));
初始化为m*n个0。
83、bug
for(int j = 1; j < n; ++j)
错误写成了下面这样
for(int j = 1; i < n; ++j)
84、等号运算
for(int j = 1; j < i - 1; ++j){
dp[5] = max({dp[5], (i - j) * j, dp[i - j] * j});//三个数,要带大括号
//上面这行,因为等号先算右边,所以可以一直更新dp[5]的最大值
}
85、二叉搜索树
如果左子树不为空,则左子树上所有节点的数值都小于根节点的数值;
如果右子树不为空,则右子树上所有节点的数值都大于根节点的数值;
86、求绝对值
abs(a);
87、背包问题
比较难
一、前后遍历顺序
从前到后 元素可以重复使用;–完全背包问题
从后到前 元素不可以重复使用;–0-1背包问题
二、里外遍历顺序
外层元素,里层背包 是组合
外层背包,里层元素 是排列
88、vector默认值为0
vector<int> data(N);
//默认初始值为N个0”
自己其实挺有天赋的
89、手写错误
vector<vector<int>> dp(n + 1, vector<int>(4, 0));
写成了
vector<vector<int>> dp(n + 1; vector<int>(4, 0));