算法积累

一、经典算法

1、二分法

题型:有若干个数,按照大小顺序排列,并且给与目标值,判断目标值是否在数列中。

解法:令l=0,r=arr.size,mid=l + ((r - l)  >> 1),while l<=r时,如果arr[mid]<target,l = mid + 1;如果arr[mid]>target,r=mid - 1

例题:数组arr从小到大排列,判断taget=10是否存在该数组中

 

2、递归

题型:可按一定规律持续深入探索至终点,注意,能够使用一次遍历完成的就不要用递归增加算法复杂度

解法:递归最重要是明确终止条件,同时理解某一节点和上一节点的关系。

例题:输入list,倒序输出list;Fibonacci函数

 

3、位运算

知识点:原码:正数符号位为0,负数符号位为1;

反码:除符号位以外,其他位取反;

补码:反码+1;注意Integer.MIN_VALUE=-2147483648,它的补码为1000000 00000000 00000000(32位)  

<< 、>> 左移或者右移,移动的位都使用0补充,如果要计算某个数的补码有多少个1可以使用00000000 00000000 00000000 00000001(1)进行按位取&,结果不等于0证明该位非零。

 

4、以空间换时间

知识点:有的题目不一定要在原数组上修改,可以通过创建多个数组来用空间换取时间,这种方法,常用在需要将原数组重新组合排列的题目上

例题:输入一个数组,将奇数全部挪至前面,偶数全部挪到后面,并保持相对位置不变

解法:创建两个ArrayList,遍历数组,将奇数放在arr1、偶数放在arr2,最后拼接之后返回。

 

5、动态规划

知识点:1+1+1=3,那么1+1+1+1=?,等于3+1,所以动态规划算法就是要计算d[n],先计算的d[n-1],然后在d[n-1]的基础上计算出来的算法。

 

6、递推法

当规律数太多,要算第N个规律数的时候,要找出规律,一个规律数一个规律数去推,而不是使用递增

 

7、归并排序

https://www.cnblogs.com/chengxiao/p/6194356.html

 

8、位运算

限制不能使用各种运算符号或者循环语法的题目,要考虑使用位运算或者Math解决.

 

9、正则表达式

字符串系列的可以使用正则表达式来实现,如果是看字符串能否转成数字的,可以使用Interger.parseInt()或者Double.parseDouble()来捕获异常

 

二、一些知识点

1、二叉树的种类

满二叉树:所有叶结点同处于最底层(非底层结点均是内部结点),一个深度为k(>=-1)且有2^(k+1) - 1个结点。如图:

 

 2、二叉搜索树

叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:

若其左子树存在,则其左子树中每个节点的值都不大于该节点值;
若其右子树存在,则其右子树中每个节点的值都不小于该节点值。

 

三、做题技巧

1、链表头问题

链表常要求返回链头,但是头指针常被移动,可以在开始的时候先创建一个无用的链表头,返回的时候返回next

ListNode head = new ListNode(-1);

return head.next;

 

2、递归条件与初始判断条件不同问题

有的题目要求输入对象为null的时候返回false,但是在递归条件里面,输入对象为Null应该返回true,这就导致了初始判断条件和递归判断不同的问题。

解决方法就是把递归的部分提取成一个新的方法,在大方法里面判断初始输入对象是否为null,为null则返回false,剩下的直接调用递归方法,这样就能做到两者分离,比如

public boolean main(int[] o){
  if:o == null ; return false

  else:return  recursive(o)  //进入递归方法

}

 

3、递归与循环

理论上能用递归实现的方法,用循环都可以实现,可是递归算法虽然高级但是经常要抽出来当一个独立方法,如果发现递归的方法不好做,那么应该使用循环来实现。

 

4、多样情况

如果一个循环例子内可能有一种或两种情形,不要老想着去适配他,干脆多判断一次

eg:https://leetcode-cn.com/problems/longest-palindromic-substring/

四、常用API

1、String

char charAt(int index)

String concat(String str)

boolean endsWith(String suffix) 是否以指定后缀结尾

boolean startsWith(String prefix) 是否以制定前缀开头

int indexOf(String str, int fromIndex) 返回子字符串中第一次出现处的索引,没有则返回-1

int lastIndexOf(String str, int fromIndex) 返回子字符串中最后一次出现处的索引,没有则返回-1

String subString(int begin,int end) 返回子字符串,[begin,end)

char[] toCharArray() 将字符串转化为char数组

 

2、ArrayList

add(int index, Element obj) 添加元素,index可选,list倒装可以index=1,插入首位。

subList(int begin,int end) 返回子列表元素,[begin,end)

sort(Comparator.naturalOrder()) 升序排列

sort(Comparator.reverseOrder()) 降序排序

toArray(T[] arr) 转化为数组

Collections.reverse(list) 倒装数组

 

3、Arrays

Arrays.copyOfRang(arr,int begin,int end) 截取数组,[begin,end)

Arrays.sort(arr,Comparator.naturalOrder()) 升序排列,Comparator.naturalOrder参数可以省略

Arrays.binarySearch(arr,int key) 查找,如果存在的话返回>0

int[]数组转成ArrayList<Integer>:Arrays.stream(arr).boxed().collect(Collectors.toList()),需要先引入java.util.stream.*,且只能转成List

 

4、Stack栈

push 添加;

pop 删除最上方一个;

peek 取出最上方一个;

 

5、Queue队列(常见LinkedList)

offer 添加

poll 删除最上方一个

peek 取出最上方一个

 

6、int[]、Integer[]之间的转换

int[]转Integer[]

Arrays.stream(arr).boxed().toArray(Integer::new)

 

7、Comparator

MyComparator implements Comparator<Integer>{

}

原本就是从小打到,所以如果o1<o2则返回正数,如果反序则逆之。

 

8、char类型转int

Character.getNumericValue(char)

posted @ 2021-11-22 20:39  折枝花满衣  阅读(87)  评论(0)    收藏  举报