![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
qaq
木子津
程序员实习生,一起加油!
展开
-
用数组结构实现大小固定的栈
用数组结构实现大小固定的栈栈结构是“后进先出”,有初始化栈、入栈、出栈、返回栈顶等功能1.初始化栈:给定一个初始大小,创建一个栈。2.定义一个变量 index,初始化为 0,用来记录栈中的元素数量。3.入栈:如果 index小于栈的大小,将要入栈的数放入数组的 index位置上,index加 1。否则报错。4.出栈:如果 index大于 0,返回数组( index- 1 ) 位置上的数,index减 1。否则报错。5.返回栈顶:如果 index大于 0,返回数组(index- 1)位置上原创 2020-11-22 17:19:30 · 150 阅读 · 0 评论 -
单链表结构,二叉树结构
ListNode单链表结构,格式{0,1,2,3,4},每个链表节点一个数字,从头到尾排布,通过,分开。class ListNode(){ int val; ListNode next = null; ListNode(int val) { this.val = val; }}1.NC78反转链表输入一个链表,反转链表后,输出新链表的表头。{1,2,3} => {3,2,1}class Solution{ public原创 2020-11-22 17:16:22 · 317 阅读 · 0 评论 -
归并排序-merge分组内排序
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;设定两个指针,最初位置分别为两个已经排序序列的起始位置;比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;重复步骤 3 直到某一指针达到序列尾;将另一序列剩下的所有元素直接复制到合并序列尾。时间复杂度O(N*logN),额外空间复杂度O(N)public class MergeSort { public static int[] mergeSort(int[] arr, int l,.原创 2020-11-22 17:14:27 · 175 阅读 · 0 评论 -
快速排序-荷兰国旗改进版
快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分。随机快速排序的细节和复杂度分析可以用荷兰国旗问题来改进快速排序 时间复杂度O(N*logN),额外空间复杂度O(logN)public class QuickSort { public static void main(String[] args) { int[] arr = {5,8,6,2,4,3}; quickSort(a原创 2020-11-22 17:10:10 · 90 阅读 · 0 评论 -
Morris神级遍历二叉树
Morris神级遍历二叉树的方法1.为什么需要morrismorris遍历是二叉树遍历算法的超强进阶算法,跟递归、非递归(栈实现)的空间复杂度,morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度为O(N),而空间复杂度为O(1)的精妙算法。morris遍历利用的是树的叶节点左右孩子为空(树的大量空闲指针),实现空间开销的极限缩减。2.实质避免使用栈结构,而是让下层到上层有指针,具体是通过让底层节点指向null的空闲指针去指回上层的原节点,从而完成下层到上层的移动建原创 2020-11-21 11:46:32 · 137 阅读 · 0 评论 -
堆排序-有图+code注释
堆结构堆的结构就是一棵完全二叉树;完全二叉树就是从树的每层从左往右依次补全完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。堆一般都是用完全二叉树来实现的。左孩子: 2*i+1; 右孩子:2*i+2父节点:(i-1)/2,i是数组位置,比如A-i=0,C-i=2大根堆:任何一颗子树的最大值都是这个子树的头部小根堆:任何一颗子树的最原创 2020-11-21 00:39:21 · 185 阅读 · 0 评论 -
非交换排序-计数排序和桶排序
计数排序空间复杂度:O(n)时间复杂度: O(n)稳定当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。算法的步骤如下:(1)找出待排序的数组中最大和最小的元素(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1桶排序原创 2020-11-21 00:38:24 · 234 阅读 · 0 评论 -
求矩阵的最大子矩阵面积
求矩阵的最大子矩阵面积问题引入——求解直方图中最大的矩形面积核心思想:让二维数组转换成多层的一维数组,再根据一维数组构建直方图//主函数,让二维数组转换成多层的一维数组,再根据一维数组构建直方图public int maxRecSize(int[][] map){ if (map == null || map.length == 0 || map[0].length == 0){ return 0; } int maxArea = 0; int[原创 2020-11-20 14:45:34 · 745 阅读 · 0 评论 -
单调栈-Java
单调栈-Java在一个数组arr[N]中,给定一个数num,分别求解各arr[i]左边比num小的距离其最近的和右边比num小的距离其最近的数,使得其时间复杂度为****O(N)****.方法一暴力向右遍历//O(N^2)暴力遍历public static int[][] rightLessWay(int[] arr){ int[][] res = new int[arr.length][2]; for (int i = 0; i < arr.length; i++){原创 2020-11-20 14:44:12 · 294 阅读 · 0 评论 -
算法-滑动窗口-Java
滑动窗口-Java生成窗口的最大值或者最小值数组,时间复杂度:O(N)。普通解法的时间复杂度为O(N * win),也就是每次对一个窗口遍历其中的 win 个数,选出最大值,最优解可以做到 O(N)。【分析】:**准备一个双端队列,双端队列存放着数组中的下标值。**假设当前为 arr[i],则放入规则如下:left 和 right 指针都只会向右移动,不会回退。right 右滑,窗口加数:1)如果 queue 为空,直接把下标 i 放入 queue 中;2)如果 que原创 2020-11-20 13:06:36 · 1187 阅读 · 0 评论