
数据结构
爱吃西红柿鸡蛋面
来者犹可追。不积硅步无以至千里。
展开
-
排序算法之归并排序
定义归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。实现思路递归方法。终止条件:元素只有一个时,本身有序。end - start == 0;像二叉树一样进行递归。递归完成后,需要做两步,1:将当前要归并的左右区间元素放入创建的辅助数组中。2:进行归并(放入arra原创 2021-09-08 17:48:29 · 118 阅读 · 0 评论 -
排序算法之堆排序
原理基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。注意:升序建大根堆,降序建小根堆。思路1.先把数组建成大根堆。2.堆顶元素和最后一个元素交换。交换完后再进行大根堆,后续交换时长度每次-1,相当于每次交换完后,有序长度+1。代码实现/** * @Author: huang * @Date: 2021/9/5 9:58 * @Description: 堆排序 */public class Main7 { public原创 2021-09-05 19:55:00 · 238 阅读 · 0 评论 -
二叉树的最近公共祖先
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2:输入:root = [3,5,1,6,2,0,8,原创 2021-09-04 17:32:36 · 100 阅读 · 0 评论 -
排序算法之选择排序
定义每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。有两层for循环。第一层for表示执行多少次能完全有序。第二层for表示要从无序区间找出最大的元素。代码实现/** * @Author: huang * @Date: 2021/8/31 15:05 * @Description: 选择排序 */public class Main6 { public static void main(String[] args) {原创 2021-08-31 16:08:22 · 86 阅读 · 0 评论 -
二叉树的层序遍历
题目描述给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3 / \ 9 20/ \15 7返回其层序遍历结果:[[3],[9,20],[15,7]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal著作权归领扣网络所有。商业转载请联系官方授权,原创 2021-08-29 23:19:32 · 102 阅读 · 1 评论 -
排序算法之希尔排序
定义思路希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。本质上和插入排序无区别,只不过是每次在原创 2021-08-26 19:05:38 · 174 阅读 · 0 评论 -
最后一块石头的重量
题目描述有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以数原创 2021-08-23 21:18:35 · 85 阅读 · 0 评论 -
查找和最小的K对数字(TopK)
题目描述给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数:[1,2],[1,4],[1,6],[7,2],[7,4原创 2021-08-23 19:31:09 · 339 阅读 · 0 评论 -
排序算法之快速排序
快排定义从待排序区间选择一个数,作为基准值(pivot);本次基准选择左边。Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边;采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据。代码实现/** * @Author: huang * @Date: 2021/8/22 15:21 * @Description: *原创 2021-08-22 17:50:57 · 95 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡定义实现原理定义:通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序第二趟,就把另一个7吐到倒数第二的位置;第三趟把6吐到了倒数第三位置;第四趟把5吐到倒数第四位置;第五趟把3吐到倒数第五位置;我们总共数组大小为6,所以第六趟2已经在倒数第六位置了,可省略第六趟,总共吐了5趟泡泡,即外层需要循环array.length-1次。我们在每一趟中都要进行比较交换,需要比较交换的次数为无序的大小-1,无序的大小是多少呢?无序大小 = array.length - 有序的大小原创 2021-08-21 21:23:59 · 118 阅读 · 0 评论 -
对称二叉树
题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/symmetric-tree著作权归领扣网络所有。商业原创 2021-08-20 20:39:51 · 73 阅读 · 0 评论 -
相同的树.
题目描述题目链接给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入:p = [1,2,3], q = [1,2,3]输出:true示例 2:输入:p = [1,2], q = [1,null,2]输出:false示例 3:输入:p = [1,2,1], q = [1,1,2]输出:false思路递归终止条件有三个:1.left和right都不为空时,返回true。2.其原创 2021-08-20 20:34:56 · 75 阅读 · 0 评论 -
平衡二叉树
题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,null,null,4,4]输出:false示例 3:输入:root = []输出:true来源:力扣(LeetCode)链接:https://leetcode-cn.com/probl原创 2021-08-20 18:59:12 · 60 阅读 · 0 评论 -
另一棵树的子树
题目描述给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例 1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true示例 2:输入:root = [3,4,5,1,2,null,null,null,nul原创 2021-08-18 21:55:52 · 131 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入:1,{1,2,3,4,5}复制返回值:{5}思路我们用快慢指针假如我们求倒数第三个结点,先让fast走3步,此时slow和fast包括的节点个数为3+1=4个。再让fast和slow同时走一步,当fast=null时跳出循环,此时slow就是倒数第k个结点。此时slow和fast包括的结点实际上是3个,slow刚好在倒数第三个节点上。代码实现/*public class ListNode { int va原创 2021-08-12 20:48:03 · 62 阅读 · 0 评论 -
链表分割.
题目描述描述现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。如:输入 head = 1->4->3->2->5->2, x = 3输出 1->2->2->4->3->5思路1.创建两个新链表left与right,left放<x的结点,right放>=x的结点2.全部放入完成后,left的尾结点连接righ原创 2021-08-12 19:52:29 · 155 阅读 · 0 评论 -
删除链表重复节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5示例1输入:{1,2,3,3,4,4,5}返回值:{1,2,5}思路我们需要定义三个指针curHead:遍历链表;pre:前驱用来连接可能断掉的链表;flg:最后返回的虚拟结点1.先判断curHead.val == curHead.next.val ,因为可能有重原创 2021-08-12 18:03:24 · 502 阅读 · 0 评论 -
链表的回文结构
题目描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true思路1.用快慢指针找出中间结点和前驱节点pre2.如果是奇数,如1->2->3->2->1,中间节点是3,前驱结点是2,我们把pre.next置为null,切一刀分成两个链表1->2,3->2-原创 2021-08-12 10:53:00 · 191 阅读 · 0 评论 -
环形链表(判断是否有环)
题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/l原创 2021-08-11 21:07:03 · 133 阅读 · 0 评论