
数据结构和算法
pao___pao
没个性,不签名
展开
-
二分查找及引申问题
1.在有序不重复元素中查找:public int BS(int[] num,int x) { int low = 0,high = num.length; int mid; while(low <= high){ mid = (low + high)/2; if(x == num[mid]) return mid; ...原创 2018-08-29 22:58:30 · 554 阅读 · 0 评论 -
Catalan数
本文由https://blog.youkuaiyun.com/adminabcd/article/details/46672759总结可解决问题:1.n个节点二叉树有多少种形态?2.矩阵链乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,有多少种括号化的方案?3.一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?4.有2...转载 2019-07-09 21:27:14 · 756 阅读 · 0 评论 -
背包问题
1.0-1背包:n件物品,每件重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使的背包内物品总价值最大,最大价值是多少,其中每件物品只有一件。public int maxValue(int[] w,int[] c,int n,int V){ int[] dp = new int[V+1]; for(int v = 0;v <= V;v +...原创 2019-03-10 13:51:30 · 177 阅读 · 0 评论 -
动态规划
1.数塔:如图,第n层有n个数字,求从顶到底每条路径数字相加和的最大值:状态转移方程:dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + f[i][j],其中dp[i][j]表示从第i层第j个位置到底层路径数字相加和的最大值,f[i][j]为第i层第j个位置上的数字。2.最大连续子序列和:状态转移方程:dp[i] = max(a[i],dp[i-1]...原创 2019-03-08 23:30:07 · 158 阅读 · 0 评论 -
一些经典的位运算
1.统计一个整数转化为二进制之后1的个数:public int NumberOf1(int n) { int val = 0; while(n != 0){ n &= n-1; val ++; } return val;}2.判断一个数是不是2的幂:public boolean isPowerOfTwo(in...原创 2019-03-02 21:14:44 · 220 阅读 · 0 评论 -
排序算法之堆排序
算法简介:将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,则双亲节点和孩子节点存在如下关系: i :父节点:i==0 ? null : (i-1)/2 左孩子:2*i + 1 右孩子:2*i + 2升序用大根堆,降序用小根堆,java中PriorityQueue底层就是用堆来实现的 空间复杂度:O...原创 2018-09-10 19:49:50 · 118 阅读 · 0 评论 -
排序算法之归并排序
算法简介时间复杂度O(n*logn),空间复杂度O(n) 稳定性:稳定代码public void mergeSort(int[] array,int low,int high){ if(low >= high) return; int mid = (low + high)/2; mergeSort(array, low, mid); mergeS...原创 2018-09-12 05:14:15 · 111 阅读 · 0 评论 -
全排列及其引申问题
全排列问题是经典的算法题目。实现可以使用库函数(如STL next_permutation), 也可以递归回溯法。同时其follow up又包括:当排列中有重复元素时如何处理;next permutaion的实现原理;查找第K个排列等。本文就这些问题进行讨论。 (转自https://www.cnblogs.com/wangxiaobao/p/5947633.html)1. 用nex...转载 2018-09-09 15:14:40 · 190 阅读 · 0 评论 -
排序算法之基数排序
算法简介基数排序利用了hash的思想,和桶排序类似,但用的桶要少很多,排序过程不含任何比较 限制条件比较多,负数要单独处理(加偏置量变成非负数或者正负数分开处理再合并) 时间复杂度O(d(r+n)) ,其中d为关键字位数,r为基数(桶的个数),n为关键字个数 空间复杂度O(r) 稳定性:稳定代码public int[] radixSort(int[] array){ /...原创 2018-09-11 16:21:39 · 206 阅读 · 0 评论 -
KMP算法
public int KMP(String s1, String s2) { if(s2.length() == 0) return 0; int i = 0,j = 0; int[] next = getNext(s2); while(i < s1.length() && j < s2.length()){ if(j ...原创 2018-08-26 00:59:21 · 167 阅读 · 0 评论 -
滑动窗口
滑动窗口是用两个指针来维持一个窗口,并通过相应策略来更新窗口的一种解题思路1.和为S的连续正数序列:(如果S=100,则18,19,20,21,22为其中一个序列)public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<...原创 2019-06-29 18:18:26 · 359 阅读 · 0 评论