算法
GarfieldEr007
这个作者很懒,什么都没留下…
展开
-
动态规划之背包问题
本文有视频版:0-1背包问题详解后台天天有人问背包问题,这个问题其实不难啊,如果我们号动态规划系列的十几篇文章你都看过,借助框架,遇到背包问题可以说是手到擒来好吧。无非就是状态 + 选择,也没啥特别之处嘛。今天就来说一下背包问题吧,就讨论最常说的 0-1 背包问题。描述:给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i],现在让你用这个背包装物品,最多能装的价值是多少?举个简单的例子,输入如下:N转载 2022-02-10 22:30:26 · 1664 阅读 · 0 评论 -
互联网算法面试高频题目
CodeTop企业题库原创 2022-02-10 00:48:28 · 515 阅读 · 0 评论 -
字节跳动高频算法题TOP100
题目 出现次数3. 无重复字符的最长子串 10625. K 个一组翻转链表 84206. 反转链表 83215. 数组中的第K个最大元素 81146. LRU缓存机制 68103. 二叉树的锯齿形层次遍历 6415. 三数之和 62121. 买卖股票的最佳时机 61160. 相交链表 581. 两数之和 48236. 二叉树的最近公共祖先 4553. 最大子序和 3942. 接雨水 3821. 合并两个有序链表 36415. 字符串相加 368转载 2022-02-10 00:33:43 · 3120 阅读 · 1 评论 -
字节跳动面试算法题
1. 实现一个字符串转换整数的函数;2. 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的,例如:链表1:1 -> 3 -> 5 -> 7链表2: 2 -> 4 -> 6 -> 8合并后的链表3:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8链表定义:struct ListNode{ int m_nValuel ListNode*...原创 2022-02-09 23:58:19 · 2410 阅读 · 0 评论 -
排序算法汇总总结
一、插入排序直接插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。代码实现:#include <stdio.h>#include <stdlib.h>void swap(i转载 2022-01-08 19:26:07 · 287 阅读 · 0 评论 -
《漫画算法2》源码整理-9 股票交易最大收益
股票交易最大收益public class StockProfit { public static int maxProfitFor1Time(int prices[]) { if(prices==null || prices.length==0) { return 0; } int minPrice = prices[0]; int maxProfit = 0; for (int i =原创 2022-01-04 10:49:17 · 296 阅读 · 0 评论 -
《漫画算法2》源码整理-8 链表中倒数第K个节点元素
链表中倒数第K个节点元素public class KthFromEnd { public static Node findKthFromEnd(Node head, int k){ Node p1 = head; Node p2 = head; //把p2指针移动到正数第n个结点 for(int i=1; i<k; i++){ p2 = p2.next; if(p2 == nu原创 2022-01-04 10:49:13 · 171 阅读 · 0 评论 -
《漫画算法2》源码整理-7 第K大的数字
第K大的数字public class KthLargestNumber { /** * 寻找第k大的元素 * @param array 待调整的堆 * @param k 第几大 */ public static int findKthLargestNumber(int[] array, int k) { //1.用前k个元素构建最小堆 buildHeap(array, k); //2.继续遍历数原创 2022-01-04 10:49:09 · 288 阅读 · 0 评论 -
《漫画算法2》源码整理-6 两数之和 三数之和
两数之和import java.util.*;public class TwoSum { public static List<List<Integer>> twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); List<List<Integer>> resultList = new原创 2022-01-04 10:49:06 · 226 阅读 · 0 评论 -
《漫画算法2》源码整理-5 二维数组螺旋输出
二维数组螺旋输出public class SpiralOrder { public static List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<Integer>(); //当二维数组是空或任何一个维度是0,直接返回 if (matrix == null || matrix.length == 0 .原创 2022-01-04 10:49:02 · 191 阅读 · 0 评论 -
《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
RK算法public class RabinKarp { public static int rabinKarp(String str, String pattern) { //主串长度 int m = str.length(); //模式串的长度 int n = pattern.length(); //计算模式串的hash值 int patternCode = hash(pattern);原创 2022-01-04 10:48:56 · 174 阅读 · 0 评论 -
《漫画算法2》源码整理-3 二分查找 跳跃表
二分查找public class BinarySearch { public static int binarySearch(int[] array, int target) { //查找范围起点 int start = 0; //查找范围终点 int end = array.length - 1; //查找范围中位数 int mid; while (start <= end原创 2022-01-03 15:00:06 · 251 阅读 · 0 评论 -
《漫画算法2》源码整理-2 图算法
GraphUtilimport java.util.LinkedList;public class GraphUtil { //深度优先遍历 public static void dfs(Graph graph, int start, boolean[] visited) { System.out.println(graph.vertexes[start].data); visited[start] = true; for (int原创 2022-01-03 14:57:46 · 645 阅读 · 0 评论 -
《漫画算法2》源码整理-1 二分查找树 AVL树 红黑树
二分查找树public class BinarySearchTree { private Node root; //查找结点 public Node search(int data) { Node targetNode = root; while (targetNode!=null && targetNode.data != data) { if (data > targetNode.data) {原创 2022-01-03 14:53:32 · 346 阅读 · 0 评论 -
《漫画算法》源码整理-7
MyBitmappublic class MyBitmap { //每一个word是一个long类型元素,对应64位二进制 private long[] words; //bitmap的位数大小 private int size; public MyBitmap(int size) { this.size = size; this.words = new long[(getWordIndex(size-1) + 1)];原创 2022-01-03 14:17:06 · 1628 阅读 · 0 评论 -
《漫画算法》源码整理-6
判断链表有环public class LinkedListCycle { /** * 判断是否有环 * @param head 链表头节点 */ public static boolean isCycle(Node head) { Node p1 = head; Node p2 = head; while (p2!=null && p2.next!=null){ p原创 2022-01-03 14:12:37 · 399 阅读 · 0 评论 -
《漫画算法》源码整理-5 排序算法
冒泡排序import java.util.Arrays;public class BubbleSort { public static void sort(int array[]) { int tmp = 0; //记录最后一次交换的位置 int lastExchangeIndex = 0; //无序数列的边界,每次比较只需要比到这里为止 int sortBorder = array.length原创 2022-01-03 13:34:23 · 237 阅读 · 0 评论 -
《漫画算法》源码整理-4 大顶堆 小顶堆 优先队列
堆操作import java.util.Arrays;public class HeapOperator { /** * 上浮调整 * @param array 待调整的堆 */ public static void upAdjust(int[] array) { int childIndex = array.length-1; int parentIndex = (childIndex-1)/2;原创 2022-01-03 13:21:31 · 194 阅读 · 0 评论 -
《漫画算法》源码整理-3 二叉树遍历
二叉树前序 中序 后序 遍历public class BinaryTreeTraversal { /** * 构建二叉树 * @param inputList 输入序列 */ public static TreeNode createBinaryTree(LinkedList<Integer> inputList){ TreeNode node = null; if(inputList==null || i原创 2022-01-03 13:15:39 · 209 阅读 · 0 评论 -
《漫画算法》源码整理-2 数组 链表 队列
数组操作public class MyArray { private int[] array; private int size; public MyArray(int capacity){ this.array = new int[capacity]; size = 0; } /** * 数组插入元素 * @param index 插入的位置 * @param element 插入的元素原创 2022-01-03 13:12:01 · 181 阅读 · 0 评论 -
《漫画算法》源码整理-1 时间复杂度 空间复杂度
时间复杂度public class TimeComplex { void eat1(int n){ for(int i=0; i<n; i++){; System.out.println("等待一天"); System.out.println("等待一天"); System.out.println("吃一寸面包"); } } void eat2(int n){原创 2022-01-03 13:09:05 · 428 阅读 · 0 评论 -
编程之美-高效率安排见面会的方法整理
【试题描述】方法一:枚举法,时间复杂度为O((n-1)^n·n^2)视为着色问题,对其中一个顶点分配颜色1,然后对剩下的n-1个顶点枚举其所有的颜色可能,再一一验证是否可以满足我们的着色要求,枚举的复杂度是O(((n-1)^n),验证一种颜色配置是否满足要求需要的时间复杂度是O(n^2)。方法二:时间复杂度O(n^2)方法三:时间复杂度O(n*log原创 2015-11-08 21:31:31 · 1049 阅读 · 0 评论 -
一些重要的算法The Most Important Algorithms
下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出转载 2016-03-13 11:52:03 · 1786 阅读 · 0 评论 -
经典算法题一览
0. 零基础入门Coding interview exposed (3ed) 这个最简单了,基础比较挫的可以从这里开始“这本书籍不是“课本”,不是“课程”,而是教你做各种常见面试题目的。熟练掌握这本书籍的内容,是你找到工作的基础。”Programming Interviews Exposed 8.0/60 | 程序员面试攻略 7.7/86 MIT的Hac转载 2016-03-15 18:42:33 · 1640 阅读 · 0 评论 -
约瑟夫环Joeph
本科系列课程参见:《软件学院那些课》问题描述约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计转载 2016-01-11 19:15:41 · 1720 阅读 · 0 评论 -
迭代最近点算法 Iterative Closest Points
研究生课程系列文章参见索引《在信科的那些课》基本原理假定已给两个数据集P、Q, ,给出两个点集的空间变换f使他们能进行空间匹配。这里的问题是,f为一未知函数,而且两点集中的点数不一定相同。解决这个问题使用的最多的方法是迭代最近点法(Iterative Closest Points Algorithm)。基本思想是:根据某种几何特性对数据进行匹配,并设这些匹配点为假想的对应点转载 2016-01-09 13:34:49 · 1836 阅读 · 0 评论 -
查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205查找算法查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行转载 2016-01-09 13:33:48 · 2283 阅读 · 0 评论 -
如何用Python实现八大排序算法
1、插入排序描述插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插 入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最转载 2015-12-06 17:11:36 · 1158 阅读 · 0 评论 -
真是O(1)吗?想清楚了没?
当然标题里这个O(1)可以换成任何复杂度。话说写程序的时候我们会用到各种数据结构,但十有八九不会由我们自己从头写起,都会直接拿来用。于是很多人就会记住,譬如HashMap或Dictionary的存取是O(1)的操作,二分查找什么的则是O(log(N))。不过,我们在实践中直接把这些类拿来用的时候,最好也留个心眼,知道这些类内部到底做了些什么,为什么它们能够达到O(1)之类的时间复杂度。转载 2015-12-21 12:34:58 · 1358 阅读 · 0 评论 -
聊聊如何检测素数
最近看到一则颇为有趣的新闻,说北大一名大一新生,以素数为标准选手机号,受到广大网友膜拜。其实素数的检测算法是很有趣的,并且会涉及到数论、概率算法等诸多内容,一直觉得素数探测算法是了解概率算法很好的入口。本文和大家简单聊聊如何确定一个数是素数。素数素数的定义素数是这样被定义的:一个大于1的整数,如果不能被除1和它本身外的其它正整数整除,则是素数(又称质数)。与转载 2016-01-05 13:00:38 · 1415 阅读 · 0 评论 -
为什么算法渐进复杂度中对数的底数总为2
在分析各种算法时,经常看到O(log2n)O(log2n)或O(nlog2n)O(nlog2n)这样的渐进复杂度。不知有没有同学困惑过,为什么算法的渐进复杂度中的对数都是以2为底?为什么没有见过O(nlog3n)O(nlog3n)这样的渐进复杂度?本文解释这个问题。三分式归并排序的时间复杂度先看一个小例子。大多数人应该对归并排序(merge sort)很熟悉,它的渐进转载 2016-01-05 12:58:03 · 3114 阅读 · 0 评论 -
算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式。例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形式为T(n)=2n−1T(n)=2n−1(设初始状态T(0)=0T(0)=0)。因为递推式求解的重要性,许多算法书籍对其有专门介绍。Donald Knuth在Concrete Mathem转载 2016-01-05 12:56:51 · 5900 阅读 · 0 评论 -
编程之美-数组分割方法整理
【试题描述】方法一:方法二:时间复杂度O(2^n)方法三:时间复杂度O(n^2 * Sum)原创 2015-11-09 20:13:04 · 1458 阅读 · 0 评论 -
编程之美-蚂蚁爬杆方法整理
【试题描述】方法一:方法二:原创 2015-11-10 18:29:08 · 1398 阅读 · 0 评论 -
算法列表List of Algorithms
List of AlgorithmsA complete list of all major algorithms (300), in any domain. The goal is to provide a ready to run program for each one, or a description of the algorithm. Programming langu转载 2016-03-26 14:12:01 · 4580 阅读 · 0 评论 -
算法之图搜索算法(一)
1. 介绍本文介绍了比较初级的图搜索算法,包括深度优先遍历,广度优先遍历和双向广度优先遍历。2. 深度优先遍历DFS2.1 算法思想从图中某个顶点v开始,访问此节点,然后依次从v中未被访问的邻接点出发深度优先遍历图,直到图中上所有和v有路径相通的顶点都被访问;若此时图中尚有顶点未被访问,则另选图中一个未被访问顶点做起点,重复以上过程,直到图中所有顶点都被访问转载 2016-03-27 13:08:13 · 2614 阅读 · 0 评论 -
算法之排列与组合算法
1. 前言本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等。2. 排列算法常见的排列算法有:(A)字典序法(B)递增进位制数法(C)递减进位制数法(D)邻位对换法(E)递归法介绍常用的两种:(1) 字典序法对给定的字符集中的字符规定了一个先后关系,在此基础上按照顺序依次产转载 2016-03-27 13:09:06 · 3282 阅读 · 0 评论 -
详解KMP算法
KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。 什么是KMP算法:...转载 2018-12-17 22:50:20 · 606 阅读 · 0 评论 -
七大排序算法的个人总结(三)
堆排序(Heap):要讲堆排序之前先要来复习一下完全二叉树的知识。定义:对一棵具有n个结点的二叉树按层序编号,如果编号为i(0 <= i <= n)的结点与同样深度的满二叉树编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。 如上面就是一棵完全二叉树。我们主要会使用的的性质是父结点与子结点的关系:标号为n的结点的左孩子为2 * n + 1(如...转载 2018-12-16 15:15:31 · 742 阅读 · 0 评论 -
七大排序算法的个人总结(二)
归并排序(Merge Sort): 归并排序是一个相当“稳定”的算法对于其它排序算法,比如希尔排序,快速排序和堆排序而言,这些算法有所谓的最好与最坏情况。而归并排序的时间复杂度是固定的,它是怎么做到的?两个有序数组的合并:首先来看归并排序要解决的第一个问题:两个有序的数组怎样合成一个新的有序数组:比如数组1{ 3,5,7,8 }数组2为{ 1,4,9,10 }:首先那肯定是...转载 2018-12-16 15:14:33 · 582 阅读 · 0 评论