「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
所有的算法题第一要义就是要明白题目讲什么,明白规律是什么,只有知道了规律才能写代码,才能轮到使用什么方法,什么工具,是用递归?还是循环?进而才能用到你总结的各种经验。
下面的题目除了动态规划,其他主要来自剑指offer的题目,而且主要是数据结构题 ,排序算法我们单独整理。
一、方法技巧总结:
1、递归模板以及使用技巧总结:
-
一般递归如果如果有
if --- else,如果你没有设置全局变量的话,一般是需要两个return的,分别在不同情况作了什么,返回各自这种情况下的结果,如果有全局变量,那么一般是没有返回值的,可以见Code015_1(com.attackOnOffer.second.Code015_01)public static void digui(ListNode listNode) { if(listNode != null) { digui(listNode.next); res.next = new ListNode(listNode.val); res = res.next; } } -
如果有两个数组一般就不用上下边界
-
我们用到了返回boolean类型,一般样式是,xxx情况返回true,xxx情况返回fasle,最后返回xx && yy 这种样式。并且一定要有个返回true,一个要返回false;见017题
public boolean method(){ if(情况1){ return true; } if(情况2){ return false; } return method(x) & method(y); } -
root.left = , root.right = 这种赋值操作,最后返回一个root ,参考004题
root.left = digui(); root.right = digui(); return root; -
当你遇到有界限的时候,果断把边界放到递归参数中,而前后边界的关系就是递归的出口
public void method(int mid, int high, int low,int[] a){ int start = low; int end = high; int i = 0; int hh = mid + 1; while(i <= start && hh <= high){ //有mid的时候 // 这是归并的套路 } while(low < high){ //不需要mid的时候 // 这是快速的套路 } if(low < high){ // 这是基本套路,退出递归 } } -
通过返回一个特殊的东西,然后添加一个if判断,如果是特殊的,就继续返回特殊的,这样能提前终止递归.参考039题。
public int method(int[] a, int count){ if(count == -1){ // 通过过特殊判断退出递归 return -1; } if(){ count == -1; return method(a,count); // 某种情况返回-1 } } -
TreeNode node = KthNode(pRoot.left,k);不要迟疑直接先写,然后下面的 if(node != null){return node;} 记住这个模式 最后返回return null,记住这个模式!
-
返回二叉树的模板
public TreeNode digui(){ if(){ return null; } if(){ return new TreeNode(x); } root.left = digui(); root.right = digui(); return root; } -
返回int的模板
if(){ return 0; } int left = digui() + 1; int right = digui() + 1; return Math.max(left,right); // 比较结果返回
2、思路总结:递归我们知道本质是重复做同一件事,经常的我们能够想明白这个事是怎么样的,但是却难以下手,为什么?因为如果从最开始的情况去思考,会很难理解,比如归并排序,一直二分下去,到最后只有一个元素,这怎么对比?怎么体现在代码上?容易思考得走火入魔。这个时候,我们可以直接把他当作中间的时候来写代码,这样十分容易。比如015循环算法,和归并排序(特别是归并)就是个例子。