算法知识要点

来源:互联网 发布:js基本数据类型有哪些 编辑:程序博客网 时间:2024/06/11 10:41

非递归的题目:

二叉树的前序、中序、后序,全排列,全子集


队列一定要掌握好,宽度优先搜索也是很基础的东西


平衡二叉搜索树,只需要知道他的定义和结构是什么,有什么样的特性,可以支持增删改操作,不需要细究其增删改方法如何实现。


记忆化搜索,即动态规划是一种思想,干的事情是:否决掉了中间重复计算的状态,如果遇到计算过的,直接return(中间状态用哈希表存储;顺序计算,把前一个状态的计算记录下来)

记忆化搜索说明用递归来做,这样会影响空间优化的事情。所以要尽量用多重循环(自底向上)的方式实现动态规划。



(自顶向下和自底向上没有优劣,只是思维方式不一样。我以后会选择“自顶向下”来做)

分治与动态规划的区别:一刀切,分治下去,一般不会有重复的点。但是动态规划则会有重复的点。

递归如果自己不熟悉的话,一定要自己手动写testcase

@@@

 for(int i = 1; i < nums.length; i++){            f[i] = false;            for(int j = 0; j < i; j++){                //or的一种编码方式,for循环,看某个符合条件,就break                if(f[j] && (i - j) <= nums[j] ){                    f[i] =true;                    break;                }            }        }

@@@

求最小值的时候,要讲数据先初始化成最大值----Integer.MAX_VALUE;

比较大小的时候,可以写简洁一点-----f[i] = Math.min(f[i],f[j]+1);

数组拿到手,可以先排个序,一般都会对解题有帮助。但如果要求时间复杂度为O(n)的,则不可行,因为排序至少O(nlogn)

merge一般需要用到指针,用到指针的循环,一般用while,而不是for。

哈希表的作用是用来确定元素在不在集合表中

@@@关于链表的基础知识,当node1 = node2,print(head)的时候,head没有动,还是输出123



链表中dumynode的使用:

ListNode dumynode = new ListNode(0);

dumynode.next = head;

head = dumynode;

.....

return dumynode.next;

链表是否为空的check:

head != null && head.next != null  

head.next != null && head.next.next != null

@@@@@数据结构题

median的问题--- quick select 快排

data stream 的概念是指给你一个数组,只能for循环一次。因为流的概念就是query一次或者一次request

动态的增加一个数,求最大值;动态的增加一个数,求中位数等----这一类属于数据结构题。

有一种数据结构支持找最大值或最小值----PriorityQueue/Heap 如何用这两个数据结构  O(logn) pop/push O(n) getMin/getMax

LRU cache 

序列,在中间删除一个数,再append到尾巴上-----linked list

key value/member ship ------hash