算法
MINKI_W
莽呀
展开
-
LeetCode一些常见的算法题的做法
删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5这个题考察了对单向链表的遍历,以及对其next和val属性的理解,加以判断就可以做出来。/** * Definition for singly-linked list. * pub...原创 2019-08-03 23:55:50 · 615 阅读 · 0 评论 -
基数排序
基本思想它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。基数排序按照优先从高位或低位来排序有两种实现方案:MSD(Most significant digital) 从最左侧高位开始进行排序。先按k1排序分组, 同一组中记录, 关键码k1相等, 再...原创 2019-08-11 23:54:23 · 196 阅读 · 0 评论 -
Java实现二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。首先在脑中建立这个二维数组的模型:图画的比较low 但是还是请您凑活看原创 2019-08-15 23:24:32 · 296 阅读 · 0 评论 -
短路求值
定义作为"&&“和”||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值(short-circuit evaluation)。这是这两个操作符的一个重要属性。例子假如expr1和expr2都是表达式,并且expr1的值为0,在下面这个逻辑表达式的求值过程中:expr1 && expr2 ...原创 2019-08-13 00:08:29 · 268 阅读 · 0 评论 -
复制带随机指针的链表
题目描述给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝思路建立一个旧-新-旧-新的链表模型新结点完全copy上一个旧结点,val,next,random打断这个结构,新结点的next指向这个完整链表的next.next即可注意特殊情况的判断代码/*// Definition for a Node.cla...原创 2019-08-21 23:52:09 · 203 阅读 · 0 评论 -
二叉树的前中后序遍历
1.前序遍历前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。若二叉树为空则结束返回,否则:(1)访问根结点。(2)前序遍历左子树。...原创 2019-08-17 00:48:35 · 595 阅读 · 0 评论 -
链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.v...原创 2019-08-17 15:21:00 · 143 阅读 · 0 评论 -
链表中倒数第K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。上手不要先写,应该先分析,画图分析。首先判断一下,如果是个空链表呢?那么就直接return null;非空链表的话我们可以利用链表数组来存储这个链表的每一个结点那么就获取了链表的下标可获取能力,然后就很简单,根据k值获取需要的结点即可。如果,链表的长度小于给定的k值,说明需求根本无法达到,那么就return null;下面是代码实现...原创 2019-08-17 15:44:21 · 179 阅读 · 0 评论 -
合并两个有序链表
题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4想法:递归:首先空链表情况,都为空,返回空,一个为空就返回另一个都不为空时,推导公式来形成递归:当 l1.val < l2.val ...原创 2019-08-17 17:38:45 · 854 阅读 · 0 评论 -
链表分割
题目描述编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。这个题啥意思呢? 就是输入个链表 :5-6-4-2 , x = 4输出应该是一个新的链表,内容为:5-2-4-6 比4小的再左边,而且顺序没变,比4大的或者相等的再右边...原创 2019-08-17 22:48:41 · 145 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路我们可以利用HashSet的不可重复特性,将重复的元素进行存储,再将所有出现过的元素存到另一个集合中创建两个链表引用,一个用来删除结点(跳过重复结点),一个用...原创 2019-08-18 01:14:09 · 180 阅读 · 0 评论 -
归并排序
归并排序归并排序是建立在归并操作上的一种有效的排序算法,1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。基本思想归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列算法描述归并排序可通过两种方式...原创 2019-08-11 00:07:45 · 258 阅读 · 0 评论 -
递归和迭代的区别
我之前竟然天真的认为递归和迭代一个意思!刚刚在看归并排序才发现人家递归和迭代是两个不同的概念!哭了1.概念区分递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有...原创 2019-08-10 23:39:09 · 214 阅读 · 0 评论 -
快速排序
快速排序快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。基本思想快速排序的基本思想:挖坑填数+分治法。快速排序使用分治法(Divide...原创 2019-08-10 00:43:06 · 163 阅读 · 0 评论 -
简单选择排序法
简单选择排序基本思想选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们...原创 2019-08-08 00:08:58 · 1925 阅读 · 0 评论 -
冒泡排序法
基本思想冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法描述冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元...原创 2019-08-08 23:21:00 · 146 阅读 · 0 评论 -
链表的回文结构
题目描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true思路:分析回文结构,就是偶数位的或者单个结点的链表可以利用栈的先进后出特性,将链表压栈,在出栈,出栈时和原链表对比,...原创 2019-08-18 16:44:54 · 142 阅读 · 0 评论 -
相交链表
题目描述编写一个程序,找到两个单链表相交的起始节点。如图相交结点为c1输入AB两个链表输出c1结点思路可以利用数组,将其中一个链表的所有结点引用都存进去,然后再用另一个链表进行循环判断,遇到相同的引用即说明存在交点,返回即可,注意空链表的情况。代码实现/** * Definition for singly-linked list. * public class ListNod...原创 2019-08-18 17:11:21 · 141 阅读 · 0 评论 -
环形链表
题目描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。思路利用双引用,就像同一个跑道,一个人每次跑两步,一个人每次跑一步,那么他们必定会相遇,这就是快慢指针。代码实现/** * Definition for singly-linked list. *...原创 2019-08-18 17:32:58 · 150 阅读 · 0 评论 -
环形链表II
题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。思路:可以利用Set的特性,存储不重复,就可以存进去然后遍历,遇到重复的直接return就行代码实现import java.ut...原创 2019-08-18 17:53:53 · 196 阅读 · 2 评论 -
希尔排序(递减增量排序算法)
希尔排序法算是直接插入排序法的增强版,是一种非稳定的排序方法。因为直插法是对比较有顺序的数组进行操作性能更好,而且直插法每次操作只移动一个元素,所以希尔排序法法便诞生了。将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。可以看到步长的选择是希尔排序的重要部分。只要最终步长为1任何...原创 2019-08-06 23:46:04 · 1122 阅读 · 0 评论 -
Java面试宝典
Java String 类字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:public class StringDemo{ public static void main(String args[]){ ...原创 2019-08-14 00:03:21 · 195 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:题目要求返回的是一个ArrayList 但是ArrayList 只有尾插,如果全部插进去再遍历输出,是正序的,所以再将元素遍历插入之前,我们应该先将原链表进行一次头插,改为逆序,然后再进行ArrayList的add操作(也就是一次尾插),这样最后输出就是一个反序的ArrayList了。代码实现/*** ...原创 2019-08-19 13:28:25 · 151 阅读 · 0 评论 -
重建二叉树(根据前序和中序遍历结果得到)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路首先通过前序遍历的结果可以得知根节点就是pre[0],然后通过根节点去在中序遍历划分左子树和右子树的范围,在根节点左边的就是左子树的值,右边则是右...原创 2019-08-19 14:26:18 · 220 阅读 · 0 评论 -
堆排序
通过数组来表示一个堆如何排序呢?第一步:创造初始堆,就是先选中最后一个非叶子结点,从右到左,从下往上,进行循环,我们做个小顶堆,那么先判断,当前这个非叶子节点的左孩子是否小于这个非叶子结点,如果小于,直接和非叶子结点交换,如果不小于,就给当前叶子节点+1,指向右节点,然后在判断是否小于非叶子节点。...原创 2019-08-26 22:16:15 · 154 阅读 · 0 评论