算法基础
god-jiang
这个作者很懒,什么都没留下…
展开
-
荷兰国旗问题&快排&BFPRT算法
荷兰国旗问题给定一个数组arr和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度为O(1),时间复杂度为O(N)解决思路初始化less=-1,more=len(arr),当前位置为cur=0。如果arr[cur]<num,交换arr[cur]和arr[++less]的数,然后cur++如果arr[cur]>num,交换arr[cur]和arr[–more]的数,然后cur不变如果当前位置上的数等于nu原创 2020-05-11 13:41:39 · 512 阅读 · 0 评论 -
神级算法——二分天下
二分查找二分查找也称折半查找(Binary Search),它是一种效率较高得查找方法。一般都是要求线性表有序,然后二分查找的时间复杂度为O(logN)。不一样的二分如果数组无序,难道就不能用二分查找了吗?答案是否定的,即使一个数组无序,也可以用二分查找来找。下面我就用两个例子来给你们上一课(膨胀了我,哈哈~~~)例子1(旋转数组):把一个数组最开始的若干个元素搬到数组的末尾,...原创 2020-04-09 15:54:23 · 479 阅读 · 0 评论 -
栈(Stack)与队列(Queue)
定义栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。队列:先进先出(FIFO-first in first out):最先插入的元素最先出来。图示本文通过一些简单的算法题来带你们更好的理解栈(Stack)和队列(Queue)。第一题题目:获取一个栈的min定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂...原创 2020-04-08 16:55:48 · 467 阅读 · 0 评论 -
神级运算——位运算
位运算概述从现代计算机中所有的数据都以二进制的形式存储在设备中。即0、1两种状态,计算机对二进制进行的运算(+、-、*、/)都叫位运算。示例:int a = 35;int b = 47;int c = a + b;计算a+b的值,在计算机中就是以二进制进行运算的。所以上面我们所给的int变量会在机器内部先转换为二进制在进行相加:35: 0 0 1 0 0 0 1 147: 0 ...原创 2020-04-02 17:45:11 · 397 阅读 · 0 评论 -
过年之抢红包算法
前言昨天是大年初一,怎么说呢,因为在读大学, 没有出来工作,所以昨晚也是陆陆续续有收到一些红包。然后想起自己对算法感兴趣,以前也看过一些公众号有讲过抢红包算法,今天就更新一遍关于抢红包的算法,对学过数据结构或者对抢红包感兴趣的可以看一看。本文就讲两个抢红包算法。PS:关于抢红包算法我是参看公众号“程序员小灰”。这个公众号是引领我学数据结构的公众号,通过漫画的形式讲得很通俗易懂。抢红包算...原创 2020-04-01 20:27:56 · 1855 阅读 · 0 评论 -
基础排序(冒泡、选择、插入)
前言基本每个人入门数据结构和算法都是先经历过排序,今天就来讲解一下最基础的三个入门排序算法。分别是冒泡排序、选择排序和插入排序。冒泡排序思路:两两交换,小的往左边,大的往右边。就是每趟过程把最大的数往右边靠,然后从剩下的数继续刚才的过程。代码(冒泡排序)package sort;import java.util.Arrays;/** * @author god-jian...原创 2020-03-31 16:58:13 · 325 阅读 · 0 评论 -
神级基础排序——堆排序
堆排序的介绍堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。完全二叉树:除了最后一层之外的其他每一层都被完全填充,每一层从左到右的填充数据,不能空缺大根堆:任意一个节点的值均大于等于它的左右孩子的值,位于堆顶的节点值最大小根堆:任意一个节点的值均小于等于它...原创 2020-03-30 18:07:09 · 328 阅读 · 0 评论 -
神级基础排序——归并排序
归并排序的介绍归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。概念是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法...原创 2020-03-29 15:50:06 · 830 阅读 · 0 评论 -
神级基础排序——快速排序
概念快速排序是一种原地排序,只需要一个很小的栈作为辅助空间,空间复杂度为O(logN),所以适合在数据集比较大且无序的时候使用。实现方法有经典快排和双指针快排,本文介绍的是双指针快排的实现。【注意】:快排的经典排序实现的partition过程其实就是荷兰国旗问题,不明白的或者不熟悉的可以先看一下荷兰国旗算法。本文的实现主要讲双指针法。荷兰国旗算法:荷兰国旗问题&快排&BF...原创 2020-03-27 15:04:34 · 806 阅读 · 0 评论 -
动态规划的高度套路
动态规划(百度百科)动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一...原创 2020-03-26 17:45:26 · 373 阅读 · 0 评论 -
神级遍历——morris
morris遍历介绍morris遍历是二叉树遍历算法的超强进阶算法,跟递归、非递归(栈实现)的空间复杂度,morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度为O(N),而空间复杂度为O(1)的精妙算法。morris遍历利用的是树的叶节点左右孩子为空(树的大量空闲指针),实现空间开销的极限缩减。morris遍历的实现原则记作当前节点为cur。如果cur无左...原创 2020-03-24 17:16:19 · 304 阅读 · 0 评论 -
排列组合的模板算法
排列组合(百度百科)排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。举例说明//abc的排列abc acb bac bca cba cab共有6种排序//abc的组合3...原创 2020-03-23 15:15:18 · 528 阅读 · 0 评论