算法编程方法总结

动态规划

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;    //从小到大  
}

没有更多推荐了,返回首页