动态规划
1、通常用数组表示,且通常从后往前思考,编程从前往后迭代实现,如两个字符串的匹配
2、写出边界函数,递归规律
树
1、回溯法 (套用backTrack)
2、前序、后续。。
3、利用递归左右子树与或,如下,先判断当前节点node(通常以叶子节点向上考虑),在与或左右子树。
bool hasPathSum(TreeNode *root, int sum) {
if(root == NULL)
return false;
if(root->left == NULL && root->right == NULL && sum - root->val == 0)
return true;
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}
4、建立树结构时,每一个左右孩子,都同样是root根节点,
TreeNode *fun(){
root = buildRoot();
root->left=fun()
root->right = fun()
return root;
}
分治
N个乱序中寻找第k大的值: 利用快速排序
给定有顺序的列表,第一反应应考虑 二分查找
注意点
1、一个数是2的指数次(1,2,4,8…),它的二进制只有1个1,利用n&(n-1) ==0 判断是否该数是否符合条件。
2、判断两个字符串是否有相同字符时,可以利用二进制方法: ’
string s="abcd";
string s2="efdg";
int vs =0;
for(int j=0;j<s.size();j++){
vs |=1<<s[j];
}
int vs2=...;
vs&vs2==0 ? 没有一个字符相同
3、桶原理
4、判断一个整数是否是回文,朴素方法是:化成字符串检测。
5、m[x][y] 为一个set时,可以设置unordered_map<int x,unordered_map<int y,set< int >> m;
部分要点
bool operator<(int a,int b){ //认为参数中默认a的值小于b,大于小于号只是表明哪个的优先级更高。
return a>b; //从小到大
}