
Java算法
ouyangjun__
这个作者很懒,什么都没留下…
展开
-
单调栈
一)单调栈简介栈的特性是“先进后出,后进先出”单调栈:在栈的基础上,单调递增或单调递减的一种特殊栈。基本原理:当一个元素进栈时,用进栈元素和栈顶元素比较,当进栈元素大于等于或小于栈顶元素时,先把栈顶元素进行出栈操作,直到栈顶元素小于进栈元素,最后把进栈元素push进栈。单调栈步骤解析:例如:有一组数据[7, 3, 8, 5, 6, 4],从左往右依次进栈。递增单...原创 2019-11-26 22:50:09 · 142 阅读 · 0 评论 -
最小栈
一)最小栈简介说明:最小栈是一种算法思路,主要是用来记录栈中最小元素,方便O(1)复杂度获取。基本原理:第一步:初始化一个主栈,再初始化一个最小栈(存放最小的元素)第二步:当数据新增时,直接push进主栈,再把进栈数据和最小栈栈顶元素比较,如数据比最小栈栈顶元素小,就push进最小栈,如比最小栈栈顶元素大,把最小栈栈顶元素重新push进最小栈。最小栈图解:...原创 2019-11-26 00:15:05 · 1210 阅读 · 0 评论 -
最长回文子串
一)简介回文数:正着和反着读是一样的,例如:abccba;回文子串:在一个字符串中,一串连续并且正着反着读是一样的字符。例如:aattyyttdd中,aa、tt、ttyytt、yy、dd都是回文子串。最长回文子串:在一个字符串中,回文子串最长的一串字符。备注:每一个单独的字符本身就可以看作是一个回文数。二)最长回文子串方式一:暴力法,执行时间复杂度是O(n^...原创 2019-11-06 22:20:20 · 795 阅读 · 0 评论 -
最长公共子序列(动态规划)
一)简介最长公共子序列简称LCS,表示两个或多个序列中最长的子序列。本质:用来寻找两个或多个序列(字符串)中最长的子序列,而子序列又可能是不连续的。描述:两个或多个序列的“相似度”例如:“BACD” 和 “CBDB” 中最长的子序列是“BD” “AAABBBCCC” 和 “DDAAFFEBBECC” 中最长的子序列是“AABBCC”二)动态规...原创 2019-11-06 21:30:11 · 2458 阅读 · 3 评论 -
Gnome排序(地精排序)
一)算法介绍Gnome排序(地精排序)也称侏儒排序,是一个比较简单的稳定排序算法。描述:它和插入排序算法非常类似,都是将元素移动到合适的位置,并通过一系列交换完成的。特点:地精排序只有一层循环,在大部分数据是有序的情况下,可以减少交换的回合数。二)算法原理基本原理:第一步:先初始化一个移动指针index,默认大小为1。第二步:判断数据是否有交换,如果数据有交换就inde...原创 2019-11-05 22:50:39 · 2786 阅读 · 0 评论 -
鸡尾酒排序
一)算法介绍鸡尾酒排序是一种定向的冒泡排序,也可以称为搅拌排序、涟漪排序。是冒泡排序的一种变形。和冒泡排序的区别在于,鸡尾酒排序采用了双向比较并替换的原理。二)算法原理基本原理:第一步:声明两个临时指针left和right,分别指向第一个元素和最后一个元素。第二步:每一轮比较时,从right往left方向查找最大数,放到right位置,从left往right方向查找最小数,...原创 2019-11-05 21:35:02 · 735 阅读 · 0 评论 -
几道回文数案例
回文数说明:指正序(从左向右)和倒序(从右向左)读是一样的。例如:abcdcba,abccba,正着读反着读是一样的。一)判断一个字符串是否属于回文数题目:给定一个字符串,判断该字符串是否属于一个回文数。方式一:暴力法原理:把字符串反转过来,一个一个字符比较。说明:该方式不推荐使用,当一个字符串非常长时,把字符串反转需耗时,再一个一个字符比较也需耗时,而且此...原创 2019-11-04 21:50:05 · 1269 阅读 · 0 评论 -
堆排序(最小堆)
一)定义和性质定义:堆是按照完全二叉树的顺序结构存储在一个一维数组中,逻辑存储是完全二叉树,物理存储是数组。性质:具有完全二叉树的顺序结构特性。 对于任意的节点,从上往下,父节点都小于左孩子和右孩子。 根节点最小的情况,称为最小堆。用数组存储二叉堆,堆的顶点下标可以从0开始也可以从1开始。堆顶下标从0开始:父节点=(i-1)/2...原创 2019-11-03 21:15:10 · 4013 阅读 · 0 评论 -
堆排序(最大堆)
一)定义和性质定义:堆是按照完全二叉树的顺序结构存储在一个一维数组中,逻辑存储是完全二叉树,物理存储是数组。性质:具有完全二叉树的顺序结构特性。 对于任意的节点,从上往下,父节点都大于左孩子和右孩子。 根节点最大的情况,称为最大堆。用数组存储二叉堆,堆的顶点下标可以从0开始也可以从1开始。堆顶下标从0开始:父节点=(i-1)/2...原创 2019-11-03 21:15:15 · 1921 阅读 · 0 评论 -
几道二分查找法案例
一)搜索所有和key相等的数题目:在一个有序列表中,搜索所有和key相等的数。步骤:第一步:先按二分查找法的方式,判断key是否存在数据中,如存在就继续下一步,否则返回null。第二步:从数据中查找到key的下标位置,因为数据是有序的,声明左右两个临时指针low和high,以key的下标位置为中心,分别向左右两个方向探测,比较是否还有和key相同的元素。第三步:围绕key下...原创 2019-10-31 20:15:03 · 1099 阅读 · 2 评论 -
两数之和的衍生题:两个超长的正整数数字字符串,求两数之和?
一)两数之和题意:给定两个超长的数字字符串,在两个数都是正整数的情况下,计算两个数之和。备注:该章主要是为了提供一种计算思路,就暂不考虑有负整数和小数的情况。分析:由于数字超长,肯定不能转换成int和long这些类型来计算,会存在溢出的情况。思路:由于计算的顺序是从右往左计算,满10进1的规则,所以可以考虑把字符串先进行反转,然后一位一位进行加法,这样相当于只需要考虑20内的加...原创 2019-10-30 20:50:06 · 772 阅读 · 0 评论 -
三数之和: 给一个整型数组nums, 一个目标值target, 从数组中找出所有三个数之和等于target的整数, 并返回这三个整数的下标。
一)介绍题意:从指定的整型nums数组中,随机取三个数,这三个数之和需要等于指定的target,如下图。分析:第一种场景是nums数组中没有负数的情况,这种情况求和的计算会少一点,因为只要比target大的数都不需要计算。 第二种场景是nums数组中有负数的情况,这种情况求和,就需要考虑nums中所有的数了,本章是考虑了该情况。问题解决思路:先从nums数组中...原创 2019-10-29 20:50:13 · 3234 阅读 · 1 评论 -
两数之和: 给一个整型数组nums, 一个目标值target, 从数组中找出所有两个数之和等于target的整数, 并返回这两个整数的下标。
一)介绍题意:从指定的整型nums数组中,随机取两个数,这两个数之和需要等于指定的target,如下图。分析:第一种场景是nums数组中没有负数的情况,这种情况求和的计算会少一点,因为只要比target大的数都不需要计算。 第二种场景是nums数组中有负数的情况,这种情况求和,就需要考虑nums中所有的数了,本章是考虑了该情况。备注:该题有两种解决方案,包括暴...原创 2019-10-29 20:40:25 · 2159 阅读 · 0 评论 -
题目:给出一串数字,选择去掉其中某一个数,如何让剩余的数乘积最大?
一)题目介绍刚一开始看到这个题目的时候,下意识的想了一下,感觉很简单,认为只需要把这一串数字中最小的数去除掉就可以了。而这正是该题目中的一个陷阱,也是思考中的一个思维盲区。比如说,当提供了一串如下图片数字的时候,那我们想的就是正确的了,直接把2去除就可以了。但如果没有提供这一串数字的时候,那么上面这张图中的一串数字就只是题目中的某一种场景了。二)题目分析根据题目中的含义,如...原创 2019-10-28 21:30:02 · 673 阅读 · 0 评论 -
几道经典递归算法案例
一)递归介绍定义:1、在函数体中直接或间接的调用自身的一种方法。2、必须要有边界值,也就是停止的条件。头递归:函数调用时不是传递本次计算的结果,而是把当前的调用状态传递,相当于要一直记录上一次函数的调用状态。这种方式会耗内存资源,当计算的值较大,递归层次较深时,容易报内存错误。尾递归:函数调用时传递本次计算的结果,不需要记录函数的调用状态,由于一直是在尾部计算,大大减少了资源占...原创 2019-10-27 18:10:20 · 3113 阅读 · 0 评论 -
按位与、按位或、异或、左移、右移、取反、无符号右移
位运算符简介Java中的位运算符:按位与、按位或、异或、左移、右移、取反、无符号右移等。规则:先把十进制转二进制,再用二进制进行位运算,再转十进制。如(计算机中一般是8位制,也可以写成32位制,不足的补0):11的二进制为: 0000 10119的二进制为: 0000 10018的二进制为: 0000 10005的二进制为: 0000 0101可理解为,二进制从右到...原创 2019-10-26 15:10:09 · 840 阅读 · 0 评论 -
二叉树高频面试题
一)二叉树数据结构// 二叉树数据结构static class Node { Node left; // 左节点 Node right; // 右节点 int value; // 节点的值 Node (Node left, Node right, int value) { this.left = left; t...原创 2019-10-09 21:55:06 · 156 阅读 · 0 评论 -
选择排序
一)算法介绍选择排序是一种简单直观的排序算法。属于不稳定排序。不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。备注:选择排序时间复杂度一直是O(n^2),适用于数据规模小,不占用额外内存空间的场景。二)算法原理基本原理:先从待排序的数据元素中选出最小(最大)元素,存放到起始位置(可以假设第一个元素就是最小或最大值),然后从剩下的数据中再寻找最小(最...原创 2019-09-08 21:45:28 · 108 阅读 · 0 评论 -
插入排序
一)算法介绍插入排序是一种比较简单的稳定排序算法。基本操作:将一条记录插入到一个已排好的有序列表中,重新得到一个记录数量增1的有序列表。稳定排序:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;二)算法原理基本原理:通过构建一个有序序列,对未排序数据,从已排序序列中从后往前扫描,找到相应的位置并插入。算法步骤图解(从first到last依次从小到大排列):源数...原创 2019-09-08 22:50:17 · 171 阅读 · 0 评论 -
希尔排序
一)算法介绍希尔排序是一种缩小增量的排序算法,也是插入排序的升级版,属于不稳定排序。基本操作:希尔排序是按增量分组,对每一组数据再进行插入排序,随着增量逐渐减少,每组的关键词越来越多,当增量为1时,数据整合成一组,算法便终止了。不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;二)算法原理基本原理:第一步:先把数据分成两组、再对两组数据进行插入排序...原创 2019-09-08 23:20:03 · 132 阅读 · 0 评论 -
归并排序
一)算法介绍归并排序是采用分治法的一个非常典型的应用,是一种稳定排序。基本操作:将一个无序的序列分割成若干个子序列,再把子序列进行比较和排序,得到完全有序的子序列,再把有序的子序列合并成一个新的有序列表。备注:归并排序时间复杂度始终是固定O(log2N),代价是需耗费额外的存储空间。稳定排序:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;二)算法原理基本原理:...原创 2019-09-12 21:35:20 · 124 阅读 · 0 评论 -
快速排序
一)算法介绍快速排序是对冒泡排序的一种改进算法,属于不稳定排序。基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据都要小,按照此方法对数据进行快速排序,以达到整个数据变成有序列表。备注:快速排序是一种适用于数据量越大,数据分布越混乱的算法,一般被认为性能是最好的。不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的...原创 2019-09-12 21:35:27 · 884 阅读 · 0 评论 -
计数排序
一)算法介绍计数排序是一种非比较排序算法,也是一种利用了空间换时间的排序算法。优势:在对一定范围内的整数排序时,时间复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。局限性:1、只适合整型数据。2、数组中的元素都必须大于0。3、不适合空间较小的场景。二)算法原理基本原理:第一步:找出数据中的最大值max和最小值min。第二步:设定一个基数值,...原创 2019-09-12 21:50:15 · 146 阅读 · 0 评论 -
二分查找法(折半查找法)
一)算法介绍二分查找法:也称折半查找法,是一种效率较高的查找方法,存在一定的局限性。局限性:适用于有序数组、有序链表等查找,例如:Array,List。二)算法原理基本原理:第一步:设定需要查找的元素key,再设定low和high两个临时指针分别指向左边第一个元素和右边最后一个元素。第二步:因为数据是有序的,先根据low和high计算出数据的中位数mid,把数据分割成左右两...原创 2019-09-12 22:45:46 · 1540 阅读 · 0 评论 -
散列表(哈希表)
一)散列表(哈希表)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。二)散列函数散列函数:能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。1)直接定址法:取关键字或关键...原创 2019-09-13 23:30:03 · 746 阅读 · 0 评论 -
基数排序(数字排序和英文字母排序)
一)算法介绍基数排序属于“分配式排序”,又称桶子排序法,是一种稳定的排序算法。基本操作:先找出数据最大的位数,然后按照从低位(从高位)开始排序,收集已排序的数据,直到最高位(最低位)排序完成。例如:先个位排序,再十位排序,然后依次是百位、千位,直到最高位。备注:基数排序有高位优先排序(简称MSD),和低位优先排序(简称LSD)两种排序方式。二)算法原理基础原理:第一步:...原创 2019-09-14 20:25:29 · 3426 阅读 · 0 评论 -
桶排序
一)算法介绍桶排序也可称为箱排序,是计数排序的升级版。工作原理:把数据平均分布到有限数量的桶中,再对每一个桶中的数据分别排序(对桶中数据排序是可选的,看具体情况)。优势:它利用了函数的映射关系,减少了数据的比较操作,效率取决于映射函数。二)算法原理基本原理:第一步:声明有限数量的桶,如:纯数字可以申请10个桶,纯字母可以申请26个桶。桶的数量是自定义,主要是方便计算。第...原创 2019-09-14 20:25:22 · 748 阅读 · 0 评论 -
十进制转二进制
一)进制简介十进制是人与人之间一种通用计算方式。二进制是计算机中一种通用计算方式。为了方便两者之间计算,所以需要进行进制转换。由于十进制存在整数和小数的情况,在转二进制时,一般是先计算整数部分,再计算小数部分,再加以合并。二)十进制转二进制整数位转换原理:十进制转二进制采用“除2取余,逆序排列”法。例如:把十进制11转二进制步骤如下:第一步:11除以2=5 余...原创 2019-08-31 00:00:56 · 17199 阅读 · 0 评论 -
二进制运算案例
二进制知识巩固和一些常用运算一)判断一个数是奇数还是偶数原理:本身和1进行按位与运算,奇数会等于1,偶数会等于0public static void main(String[] args) { // 判断一个数是奇数还是偶数 System.out.println(11&1); // 结果为1 System.out.println(10&1); // 结果为0 ...原创 2019-08-31 14:30:12 · 2741 阅读 · 0 评论 -
有序数组、有序链表高效去重
一)有序数组去重基本原理:第一步:初始化两个指针,一个慢指针slow、一个快指针fast。第二步:判断慢指针slow和快指针fast的值是否一致,如不一致,慢指针slow加1、并把快指针fast的值赋值给慢指针slow,然后快指针fast加1。第三步:继续扫描后面的元素,如果慢指针slow和快指针fast的值一致,说明元素重复,快指针fast直接加1并继续扫描。第四步:重复第二...原创 2019-09-26 20:30:16 · 823 阅读 · 0 评论 -
冒泡排序
一)算法介绍冒泡排序是一种入门级的稳定排序算法。该名称的由来是因为越大的元素会经过交换,慢慢“浮”到顶端。稳定排序:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;二)算法原理基本原理:比较相邻的两个元素。如果第一个比第二个大,就交换他们两个。对每一对相邻的元素作同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。算法步骤图解(从head到last...原创 2019-09-08 20:50:12 · 178 阅读 · 0 评论