算法学习
LeetCode与剑指offer常见题目总结:
1、回溯算法
2、分治算法
3、递归算法
4、贪心算法
5、排序算法
6、搜索算法
7、动态规划
linkingfei
coder;
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
滑动窗口相关算法
1、包含子串所有字符的最小窗口public static String minWindow(String s, String t) { if (s.length() < t.length()) { return ""; } char[] sArr = s.toCharArray(); char[] tArr = t.toCharArray(); int[] hash = new int[256];原创 2020-11-02 20:14:29 · 1051 阅读 · 0 评论 -
分治思想—相关算法
1、算法流程递归返回条件分段处理合并结果数据结构:类似二叉树结构或者可以用二分法递归处理的数据结构典型应用如:快速排序,归并排序模板func traversal(root *TreeNode) ResultType { // nil or leaf if root == nil { // do something and return } // Divide ResultType left = traversal(roo原创 2020-11-01 20:19:15 · 223 阅读 · 0 评论 -
二分法思想—相关算法
1、二分法模板模板1 (left <= right):查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素)。不需要后处理,因为每一步中,你都在检查是否找到了元素。如果到达末尾,则知道未找到该元素。模板 2 (left < right):查找条件需要访问元素的直接右邻居。使用元素的右邻居来确定是否满足条件,并决定是向左还是向右。保证查找空间在每一步中至少有 2 个元素。需要进行后处理。 当你剩下 1 个元素时,循环 / 递归结束。 需要评估剩余元素是否符合条件原创 2020-11-01 20:41:00 · 313 阅读 · 0 评论 -
二分法—平方根计算
题目:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。* 二分法* 牛顿迭代法:梯度下降法(最速下降法),泰勒公式展开等 /** * @param num 计算数值 * @param epsilon 误差 * @return */ public static double sqrt2(double num, double epsilon) { double low =原创 2020-11-01 15:54:28 · 450 阅读 · 0 评论 -
二分法—递归与非递归查询
二分法适用于有序的场景1、非递归实现private static int search(int[] data,int target) { if(data.length < 1){ return -1; } int l = 0; int r = data.lenth -1; while(l <= r) { int mid = (l + r) / 2; if(data[mid] == target) { return原创 2020-11-01 13:03:25 · 244 阅读 · 0 评论 -
数组系列—数组主要数据
数组主要数据大于长度一般的数字static int majorNum(int[] arr){ int tmp = arr[0]; int count = 0; for (int i = 0; i < arr.length ; i++) { if (tmp == arr[i]){ count++; }else { count--;原创 2020-11-01 18:29:47 · 163 阅读 · 0 评论 -
数组系列—数组中重复的数字
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。Input:{2, 3, 1, 0, 2, 5}Output:2要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。本题要求找出重复的数字,因此在调整过程中,如果第 .原创 2020-11-01 15:41:32 · 215 阅读 · 0 评论 -
数组系列—数组中第k大的数
/** * 快速排序找第k大的数: * 快排的每次将一个数排到有序时的位置, * 前面的小于、后面的大于当前值 * */ public int findKMaxInteger(int array[],int low,int high, int findK){ int...原创 2018-08-31 16:29:11 · 881 阅读 · 0 评论 -
数组系列—数组两数和的下标
散列表方式:public void findBathIndex(int[] arr,int k){ if(arr==null){ return; } Hashtable<Integer,Integer> map=new Hashtable<Integer,Integer>(); ...原创 2018-08-31 18:38:21 · 851 阅读 · 0 评论 -
数组系列—找出不重复的元素
给定一个数组,里面只有一个数出现了一次,其他都出现了两次。怎么得到这个出现了一次的数?异或法public void findOne(int[] arr){ int k=0; for(int i=0;i<arr.length;i++){ k=arr[i]^k; } System.ou...原创 2018-08-31 17:06:35 · 3666 阅读 · 0 评论 -
数组系列—连加和最大子数组
穷举法:穷举法: 例: 1 -2 4 3 -1 -4 j=0 1到-4找最大子序列、保存下标start、end j=1 -2到-4.. j=2 4到-4.. . j=5此算法遍历了所有情况、时间复杂度为O(n2)public void find(int[] array){ int maxSum=a...原创 2018-08-17 16:40:25 · 323 阅读 · 0 评论 -
数组系列—连续数中寻找缺失的数字
连续数中寻找缺失的数字:通过散列表实现: public static void find(int[] array){ Hashtable<Integer,Integer> hasht= new Hashtable<Integer,Integer>(); ...原创 2018-08-17 16:08:10 · 3633 阅读 · 0 评论 -
数组系列—找出数组的第k大个数
思路:由于快排每趟排序,排好一个元素、以递归的方式、对排好序的元素的两边再继续排序【前半部分小于当前元素值、后半部分大于当前值】。查找第k大个元素时,先执行一次快排,判断排序好的位置、若不为k,比较大于k第k个元素一定在小于k-1的位置、否则一定在大于k+1的位置例: 查找第k=5大元素 3 1 4 2 8 5 1趟 2 1 3 4 8 5 ...原创 2018-08-17 16:01:02 · 1443 阅读 · 0 评论 -
数组系列—旋转数组的最小数字
/** * 利用二分法求旋转数组的最小数: * * 3,4,5,1,2 * 1 0 1 1 1 * 1 1 1 0 1 * * */ public static int getMin(int[] arr){ int start=0; ...原创 2018-09-01 23:03:40 · 119 阅读 · 0 评论 -
动态规划—递归与动态规划
棋盘m×n的走法: 给定一个M×N的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离 f(m,n)=f(m-1,n)+f(m,n-1). 于是状态f(i,j)的状态转移方程为: f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0 f(i,j)=f(i,j...原创 2018-09-02 13:30:55 · 351 阅读 · 0 评论 -
链表系列—约瑟夫环问题
使用循环链表获取出环的序列:public static Node build(int k){ Node root=new Node(); Node head=root; root.dat=1; int i=2; while(i<=k){ ...原创 2018-09-16 14:09:14 · 245 阅读 · 0 评论 -
链表系列—链表相关操作
public void printCommonPart(Node head1,Node head2){ if(head1==null||head2==null){ return; } System.out.println(&quot;print common part:&quot;); while(head1!=null&amp;amp;...原创 2018-09-02 10:52:33 · 173 阅读 · 0 评论 -
链表系列—单链表逆序输出
public class Reverse{ public static void main(String[] args) { Node root=build(5);; Node node=root; while(node!=null){ System.out.print(node.value+" "); ...原创 2018-09-01 21:35:12 · 3916 阅读 · 1 评论 -
链表系列—链表环相关问题
链表环:判断是否存在环: 设置两个节点:slow、fast 若存在环,必定会在环上的节点相遇 public static boolean hasCircle(Node root){ Node slow=root; Node fast=root; while(fast!=null&&fa...原创 2018-08-18 18:21:40 · 259 阅读 · 0 评论 -
二叉树系列—二叉树路径问题
/** * 1 * 2 3 * 4 5 6 7 * * * 先序遍历: * 注意用list存储时,找出一条路径时4时: * left=right=null,移除4 * 为2时: * left、right遍历完成,移除2节点 * */...原创 2018-09-15 18:36:01 · 2019 阅读 · 0 评论 -
二叉树系列—搜索二叉树操作
public class BinarySearch{ public static void main(String[] args) { int[] arr={5,3,7,1,4,6,8}; Node root=create(arr, 0); System.out.println(search(root, 8)); I...原创 2020-10-18 10:33:27 · 157 阅读 · 0 评论 -
二叉树系列—恢复二叉树
先序与中序:public class ReBuildBinaryTree{ public static void main(String[] args) { int[] pre={1,2,4,7,3,5,6,8}; int[] mid={4,7,2,1,5,3,8,6}; Node root=rebuild(pre, mid...原创 2018-09-01 22:14:26 · 1013 阅读 · 0 评论 -
二叉树系列—二叉树遍历
二叉树层次遍历: 思路: 访问根节点,并将根节点入队。 当队列不空的时候,重复以下操作。 1、弹出一个元素。作为当前的根节点。 2、如果根节点有左孩子,访问左孩子,并将左孩子入队。 3、如果根节点有右孩子,访问右孩子,并将右孩子入队。 public void levelOrder(TreeN...原创 2018-08-18 17:28:43 · 236 阅读 · 0 评论
分享