Skip to content

Latest commit

 

History

History
 
 

第三周学习总结

1.递归

本周的算法都是围绕递归,包括特殊的递归的方法分治、回溯等,需要熟练掌握几种递归的模板,
这个相对容易些,最难有两点,一是如何找到可重复的规律;二是如何确定drill down的参数。觉
得这些都不是通过几天的训练就能搞定的,需要大量的练习和一定的逻辑抽象能力,大家需要坚持啊,
找规律的事本身就不是容易的事,这个和算法、coding的能力没啥关系。

做递归题目的一些方法

画图:画图帮助分析是非常重要的解题方法,画图不是为了人肉递归,而是为了更好的归纳和总结
优化:分析搜索起点的上界进行剪枝

2.需要练到手抽筋的魔法模板

  • 说到模板的事,大家其实记住即可,就像你写代码或看一些开源项目都会用到设计模式一样,一看到 这个代码模块或结构与XXX设计模式模板一样啊,那你再看这块代码的时候就知道它要解决哪类问题, 你要是不了解这个设计模式模板的话,看那些代码会很难理解,会浪费很多时间,大家都这么写,这 就是固定的模式,理解记忆就好,学会了就行了。

递归

public void recur(int level, int param) { 
        //terminator
        if (level > MAX_LEVEL){
            // process result
            return;
        }
        //process current logic
        process(level,param);
        //drill down
        recur(level+1,newParam);
        //restore current status
    }

分治

public int divide_conquer(Problem problem){
        if(problem ==null){
            int res=process_last_result();
            return res;
        }
        subProblems=split_problem(problem);
        res0=divide_conquer(subProblems[0]);
        res1=divide_conquer(subProblems[1]);
        return result;
    }

回溯

private void backtrace(State state, Data data) {
    if (state.isComplete()) {
        addStateToResult(state);
        return;
    }

    // loop all choice
    while (condition) {
        Data curentData = processData(data);
        state.changeState();
        backtrace(state, data);
        state.rollbackState();
    }
}

迭代

  • 做子集的题迭代算法是非常巧妙的,下边是一个牛顿迭代算法的实现,这个更牛, 不愧是“牛顿”。
pubic int mysqrt(int x){
	double tmpx = x;
	double k = 1.0;
	double k0 = 0.0;
	while(abs(k0-k) >= 1){
		k0 = k;
		k = (k + tmpx/k)/2;
	}
	return (int)k;
}

3.最重要的事情重复说

    做过的题要抽空回溯,否则人的记忆是会随着时间的推移丢掉的,每天学习新的课程和练习新题目
 的时候不要忘记做过的题目啊,技术的事不能喜新厌旧哦。