算法学习笔记总结记录(一)

106 阅读3分钟

「这是我参与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循环算法,和归并排序(特别是归并)就是个例子。