算法 整理

Java常用方法

基本类型

1、String常用方法

		//获取子串下表
        String str1="23asdf828fasg2gag";
        System.out.println(str1.indexOf("l"));//返回str中第一个“l”下标 从0开始算 		,没有则返回-1
       
       //获取子串
        String str2="23asdf828fasg2gag";
        System.out.println(str2.substring(0,3));//23a

		//获取某下标的值
        String str3="23_asdf828fasg2gag";
        System.out.println(str3.codePointAt(2));//获取ASCII编码
        System.out.println(str3.charAt(2));//获取字符

		//转字符char数组
		String str4="asdbvhkwiuvb"
		str4.toCharArray();

2、字符串反转

使用 StringBuilder 对象或 StringBuffer 对象的 reverse() 方法

        StringBuilder sb = new StringBuilder("abcd").reverse();
        System.out.println(sb);//dcba

3、String 与 其他类型

String转int:Integer.valueOf("345678")//入参不能有非数字

集合Collection && 数组

拷贝创建数组:Arrays.copyOfRange(数组,fromIndex,toIndex);
数组排序:Arrays.sort(数组);
排序:

public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(10);
        list.add(13);
        list.add(12);
        list.add(11);
        list.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return  o1-o2;
            }
        });
        System.out.println(list);
}
 public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(10);
        list.add(13);
        list.add(12);
        list.add(11);
        Collections.sort(list);
        System.out.println(list);
}

IO

常用类

栈 Stack

文档
1047. 删除字符串中的所有相邻重复项

队列

253. 会议室 II 使用的排序

优先队列/小根堆 PriorityQueue

//通过设置参数为比较器,创建大根堆或小根堆
PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.val - o2.val;
            }
        });

堆 例题

Hash

1、使用hash去重

	public static void main(String[] args) {	
		List set = new ArrayList();
		set.add(1);
		set.add(2);
		set.add(2);
		set =duplicateList(set);
		Iterator iter = set.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
	}
	
	//用HashSet的无序性、不可重复,过滤重复数值
	public static List duplicateList(List list) {
		HashSet set = new HashSet();
		set.addAll(list);
		return new ArrayList(set);		
	}

2、hash计数

        Hashtable<Integer,Integer> hashtable=new Hashtable<>();
        hashtable.put(10,1);
        if (hashtable.containsKey(10)){
            Integer integer = hashtable.get(10);
            integer++;
            hashtable.put(10,integer);
        }
        System.out.println(hashtable.get(10));

3、LRU 最近最少使用
leetcode

JZ86 在二叉树中找到两个节点的最近公共祖先

DFS/BFS

200. 岛屿数量
39. 组合总和
254. 因子的组合
490. 迷宫

1102. 得分最高的路径 DFS+二分

分割

776. 拆分二叉搜索树

Prim && Kruskal

1135. 最低成本联通所有城市

拓扑排序

1136. 并行课程

Math

参考文档

常用算法

递归

124. 二叉树中的最大路径和

回溯法

使用场景:组合、排列、子集、切割等
例题:
例题
leetcode46. 全排列

动态规划 DP

概念:发现计算过程中有重复计算部分,则把答案记下来,下次直接用。
例题:斐波那契

例题:背包问题
暴力:从左往右,依次选择要或者不要,构成递归
傻缓存:有重复分支,用n维数组缓存
DP:从n维数组找依赖

TIPS:
在还不熟悉 的时候,先暴力写出来(例如递归、BFS、DFS等),再改傻缓存,最终动态规划:例题
当出现重复点的时候可以优化

模型

从左到右:
背包问题
leetcode1
leetcode300
leetcode309
53. 最大子数组和
122. 买卖股票的最佳时机 II顺便看看贪心
范围:例如两个人只能从数组左右选,谁选的总和最大。(先手后手问题)重点是开头如何如何、结尾如何如何

样本对应:最长公共子序列问题 例题

业务:

必会

最长子序列应用:
leetcode

滑动窗口

JZ59 滑动窗口的最大值
76. 最小覆盖子串
JZ85 连续子数组的最大和(二)
剑指 Offer II 016. 不含重复字符的最长子字符串
159. 至多包含两个不同字符的最长子串注意value部分存的是下标而不是个数,右指针更新下表,这样左指针就能从删除的下表开始。
340. 至多包含 K 个不同字符的最长子串

双指针

76. 最小覆盖子串

贪心

保证局部最优,使得最后出现的结果全局最优。
例题

并查集

323. 无向图中连通分量的数目
305. 岛屿数量 II
1061. 按字典序排列最小的等效字符串

累加和 累乘积

548. 将数组分割成和相等的子数组

数学

x进制

660. 移除 9

算法知识体系(Java)

位运算

int类型占4个字节 共32位。正整数最大 231-1,复数最大 -231。首位是符号位。
正数二进制:首位是0,后面是这个数的二进制。
负数二进制:首位是1,后面是的二进制取反+1 表示数值。例如:-1对应1111……111全是1

ps:按位取反符号

int a=3456789;
int b=~a;

二进制输出

public static void print(int num){
	for(int i=31,i>=0;i--){
		System.out.print(num&(i<<i)==0?"0":"1")
	}
	System.out.println()
}

右移

有两种右移:>>>>>
>> 表示带着标志位一起右移一位,负数会右移之后在符号位补上1
>>>表示不带标志位右移,负数右移之后符号位补0

相反数

正负数都适用

int a =5;
int b=-a;
int c=~a+1;

ps:最小的负数取相反数,是它自己

随机数

01随机数

double ans1=Math.random();//返回[0,1)上的随机数
int ans2=(int)(Math.random()*k);//[0,k-1]范围上的等概率整数

题:任意x(x在0,1区间) 返回[0,x)数的概率为x^2

return Math.Max(Math.random(),Math.random());//概率论知识,两次独立事件,最大结果小于x

0N随机数再随机–01发生器

题:F()函数等概率得到1-5的随机数,怎么得到1-7等概率随机数
解:
第一步,改成01等概率。例如12返回0,45返回1,3重试
第二步,1-7转换成0-6,至少需要3个二进制位
第三步,遗弃超出6的结果,只保留0-6部分

数组

如果时间复杂度会比较高的话,不如先排个序。
三数之和

排序算法

快速排序的改写
215. 数组中的第K个最大元素

二分及其扩展

KMP

某个String,把前面一部分剪切到后面去。例如123456变为456123。

解:
第一步,自己接自己:123456123456
第二步,看是不是这个拼接后字符串的子串。456123是123456123456

应用在树

二叉树2的结构,是否和二叉树1的某子树是一致的。

满足:先序遍历(null补空的位置),树2是树1的kmp子串 。用String数组来存放节点值最好

BFPRT

返回无序整数数组第K小的数 O(N)时间复杂度

解法一:用概率收敛到O(N)
类似快排,k在本次所当选出m下标范围内时结束,否则左侧或右侧再次执行。(注意:不进行真的排序)

解法二:BFPRT
跟之前的算法不同的是选择pivot,

递归 & 动态规划

贪心

链表

栈 & 队列

表 & 堆

排队问题

例:给定一个数组arr,长度为n表示arr[i]服务员的服务时间,给定一个正数m表示有m个人等位。
当m数量级不大时可以采用小根堆
当m数量级很大时可以采用二分
参考

小根堆

二分法

其他

题目:
将数组中奇数放在奇数位置,偶数放在偶数位置
解析:
a、b指针分别从开头开始,各自指向奇数或偶数位置,每次位置增加2。c指针指向最后一个位置,奇数ac交换值,偶数bc交换值。

你可能感兴趣的:(笔记,算法,java,开发语言)