算法-基础算法
if_i_were_a
你好
展开
-
LeetCode 21合并两个有序链表
LeetCode第21题,也是剑指offer上的一个题,题目描述如下:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 public static ListNode mergeTwoList...原创 2019-04-10 10:55:30 · 122 阅读 · 0 评论 -
二叉树的广度优先遍历/层次遍历/之子形遍历
二叉树的广度优先遍历的思想:借助一个队列,将二叉树的根入队,根节点出队,打印,如果根节点的左孩子不为空,将左孩子入队,如果根节点的右孩子不为空,将右节点入队,然后继续取出当前队列中的第一个元素,访问,将其左孩子右孩子入队...直到队列为空,结束循环public class Solution { ArrayList arrayList = new ArrayList(); ...原创 2019-04-11 17:32:20 · 1038 阅读 · 0 评论 -
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
题目描述:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。LeetCode的83题,以后题目的序号有可能会改变示例1:输入: 1->1->2输出: 1->2示例2:输入: 1->1->2->3->3输出: 1->2->3代码如下:public ListNode...原创 2019-04-08 15:51:46 · 3468 阅读 · 0 评论 -
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
与这个题相似的有一道题,保留原始链表中重复数字出现一次博客地址:https://blog.csdn.net/if_i_were_a/article/details/89092123本题的题目描述:(本题是LeetCode第82题)给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。示例1:输入: 1->2->3->3-&g...原创 2019-04-08 16:23:03 · 4027 阅读 · 0 评论 -
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
分割链表:题目如下:给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点都在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5这个题是LeetCode第86...原创 2019-04-08 18:04:48 · 3597 阅读 · 1 评论 -
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
本题是LeetCode第19题,以后题目也可能会变。本题的描述如下:示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.思路:用两个节点,删除让前一个节点比后一个节点先跑n次,然后两个一起跑。当前一个节点遍历结束或者为空的时候,后一个节点是要删除的元素,但是要删除一...原创 2019-04-09 08:41:48 · 3158 阅读 · 4 评论 -
LeetCode 141判断链表是否有环[附创建链表的代码]
LeetCode上面的141题,同时也是昨晚携程笔试编程的第1题。当时那个函数很快就写出来了,但是在创建环形链表这儿一直绕不出来,花了很长时间。下来跟大家讨论才知道有的人有HashMap解决了,HashSet也有的解决了,还有的直接用一个char数组给解决了。还是把自己的方法整理一下思路就是两个指针,一个每次向前跑两个,一个向前跑一个,如果在某一个时间点,两者重复了,就说明是环形链表函...原创 2019-04-09 09:55:37 · 278 阅读 · 0 评论 -
LeetCode142给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
这是LeetCode上面的142题,同时也是剑指offer上的一个题整体思想:当判断完当前链表有环之后,先确定环的个数,确定完之后,让前面的指针开始先跑n个节点,然后两支针一起跑,两个指针相等的那个位置就是环形链表的入口节点代码如下: public static ListNode detectCycle(ListNode head) { if (head == n...原创 2019-04-09 17:05:56 · 2373 阅读 · 0 评论 -
找到搜索二叉树的最大值节点,最小值结点,删除二叉树中的最大值节点,最小值节点,删除二叉树中的任意节点
删除二分搜索树的最大值和最小值最小值在最左的,递归直到某个节点的左子树为空,就是找到了最小值,删除该节点,有可能这个节点的右子树还有值,所以这个时候将右子树节点暂存,然后将这个节点的右子树赋值为空,然后返回右子树二分搜索树删除任意节点删除有右孩子没有左孩子的节点,同删除最大值节点一样删除有左孩子没有右孩子的节点,同删除最小值节点一样删除左右都有孩子的节点 d找到d的右子...原创 2019-04-12 22:20:24 · 2234 阅读 · 0 评论 -
详解平衡二叉树(AVL)
说明:本博客的所有图片来源于慕课网平衡二叉树(AVL树)也是面试中的一个点,好的回答可以让面试官的印象更深刻定义 AVL树:对于任何一个节点[任何一个节点,不只是叶子节点],左子树和右子树的高度差不为1平衡因子: 对于左右子树的高度差[左子树的高度减去右子树的高度]说明:AVL是改变二分搜索树极端的情况下为链表的情况,[每个节点只有左孩子],所以AVL引入了平衡因子...原创 2019-04-18 09:41:39 · 887 阅读 · 0 评论 -
详解二三树
2-3树:说明:本博客的图片均来自慕课网满足二分搜索树的基本性质节点可以存放一个元素或者两个元素2-3是一棵绝对平衡的树,从根节点到任意一个叶子节点锁经过的节点数量一定是相等的2-3树如何维持绝对的平衡?[2-3树添加节点绝对不会添加到空节点中,节点的融合,子树的分裂]如果插入的是2节点:节点的融合如果插入的节点是3-节点,父亲节点为2-节点...原创 2019-04-18 16:04:27 · 3626 阅读 · 0 评论 -
求数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 public static void main(String[] args) { int[] nums = {7, 6, 7, 5}; int[] nums1 = {0}; int[] nums2 = {0}; Find...原创 2019-07-16 15:26:58 · 621 阅读 · 0 评论 -
复杂链表的复制
题目如下:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)两种方法,在代码中已标识清楚,在牛客网上均通过关于第一种方法详细请看https://blog.csdn.net/wszy1301/article/details/8...原创 2019-07-18 20:19:27 · 626 阅读 · 0 评论 -
优秀的归并排序算法及其优化(思想+代码)Java实现
归并排序是面试中比较常见的一种排序算法,之前面试官问的时候,答得总是很浅,今天将其总结如下,希望下次回答的令人满意。归并排序的思想:采用分治的思想,具体步骤如下归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。如 设有数列{10,4,6,3,8,2,5,7}初始状态:10,4,6,3,8,2,5,7第一次归并后:{4,10},{3,6},{...原创 2019-07-29 16:15:04 · 1366 阅读 · 3 评论 -
二叉树的非递归前序遍历
二叉树的非递归的遍历实现思想:借助栈,对于根节点,先将当前节点压入栈中,然后遍历的时候弹出栈中的一个元素,输出,当该节点的右节点不为空时,将节点压入栈,当左节点不为空时,将左节点压入栈[前序遍历是根左右但是栈的数据结构时先入后出,先访问到左节点,需要将右节点先压入栈中]。继续循环,弹出栈顶元素,输出,将右节点和左节点压入栈中...代码如下: public void pre...原创 2019-04-11 17:14:31 · 8550 阅读 · 1 评论 -
二叉搜索树的插入,前序,中序,后续遍历和打印
分享一个慕课网的算法,二叉树的打印,输出和插入public class BST1<E extends Comparable<E>> { private class Node { public E e; public Node left, right; public Node(E e) { ...原创 2019-04-11 16:50:35 · 560 阅读 · 0 评论 -
快速排序的实现(C语言和Java实现)
基本思想:确定一个基准值,通过一趟排序将要排序的数据分割成独立的两部分,左边的数据比指定的值小,右边的数据比指定的值大,然后再对左右两边分别进行递归C语言实现:#include<stdio.h>void print(int a[],int n){ int i; for(i=0;i<n;i++) { printf("%d ",a[i]); } pr...原创 2019-03-26 17:15:05 · 100 阅读 · 0 评论 -
两个升序数组合并为一个升序数组,时间复杂度O(n)
/*两个升序数组合并为一个升序数组*/#include<stdio.h>//从键盘接受的函数 void scanfArray(int Array[],int n){ int i; for(i=0;i<n;i++) { scanf("%d",&Array[i]); } }//排序函数 void sort(int Array1[],int n,in...原创 2018-09-05 19:55:39 · 4062 阅读 · 0 评论 -
两个升序链表合并成一个升序链表
//将两个升序链表和并成一个升序序列#include<stdio.h>#include<stdlib.h>typedef struct node{ int data; struct node *next;}LinkNode;LinkNode* Creat_LinkList2(){ int x; LinkNode* h;...原创 2018-09-09 18:13:31 · 3630 阅读 · 0 评论 -
找出数组中的重复的数字
//面试题 摘选自<<剑指offer>>第39页/*在一个长度为n的数组里的所有的数字都在0~n-1的范围内,数组中的某些数字是重复的,当不知道有几个数字是重复的,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如长度为7的数组{2,3,1,0,2,5,3}那么对应的输出是重复的数字2或者3*/解决本题的思路:(将整个数组遍历一次即可,时间复杂...原创 2018-08-25 18:18:57 · 243 阅读 · 0 评论 -
关于链表的算法总结
1.头插法建立链表:必须有一个终止条件,当输入为-1的时候表示输入的结束头插法建立链表的函数是没有参数的传递的,在函数中用malloc来申请一个头结点while的函数在最后一句要有scanf语句,表示等待下一个结点的值输入头插法用代表头结点的链表,不用区别头结点是否为空,两条核心语句都可以搞定头插法在建立链表的时候,输出的链表的数据域的值与输入值的顺序相反在测试输出的时候需...原创 2018-09-11 16:52:11 · 423 阅读 · 1 评论 -
判断链表时候有环,输出环的入口结点
//链表中环的入口结点#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}LinkNode;LinkNode* Creat_LinkList2(){ int x; int k=0;//计数 LinkNo...原创 2018-09-10 21:39:49 · 131 阅读 · 0 评论 -
逆向输出链表的值
/*剑指offer p59逆向输出当链表的所有节点的值当链表非常长的时候,递归的层次比较深,从而有可能导致函数调用栈溢出*/#include<stdio.h>#include<stdlib.h>int Array[100];int top=-1;typedef struct node{ int data; struct node *nex...原创 2018-09-08 17:41:16 · 393 阅读 · 0 评论 -
两个升序数组合并成一个升序数组,第一个数组有足够容纳第二个数组的空间
/*两个升序数组合并为一个升序数组题目要求:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间*/#include<stdio.h>void scanfArray(int Array[],int n){ int i; for(i=0;i<n;i++) { scanf("%d",&Array[i]); ...原创 2018-09-05 18:55:09 · 919 阅读 · 0 评论 -
字符串中空格的替换
《剑指offer》p51/*面试题5替换空格: 请实现一个函数,把字符串中的每个空格替换成20%。例如“We are happy”则输出“We%20are%20happy”*/#include<stdio.h>void stringReplace(char str1[]){ int i,j; int originLength,newLength=0;...原创 2018-09-05 17:57:02 · 383 阅读 · 0 评论 -
删除链表一个结点时间复杂度为O(1)
/*剑指offer p119 面试题18在O(1)时间内删除链表结点 */#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;} LinkNode;LinkNode * createLinkList(){ LinkN...原创 2018-09-08 15:57:49 · 1844 阅读 · 0 评论 -
LeetCode 160找到两个单链表相交的起始结点
编写一个程序,找到两个单链表相交的起始节点。LeetCode160题,剑指offer上的题 public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return null; ...原创 2019-04-10 18:43:30 · 272 阅读 · 2 评论 -
删除链表中的值为某个给定节点的值[带表头结点和不带表头结点及两种递归方法]
这个题是一个关于链表的基础题,也是LeetCode中的一个题(现在是203题,以后可能题号会变)虽然这个题比较基础,但是还是有很多坑。请看代码:/** * 不带表头结点的链表的删除 * @param head 传进来的链表的头指针 * @param val 要删除的值 * @return */ public ListNode ...原创 2019-04-06 22:20:39 · 1154 阅读 · 0 评论 -
链表的反转(逆置)
剑指offer面试题24 p142LeetCode第204题本题有两种解法,迭代法和递归法:迭代法比价好理解:代码如下:,要注意的是必须用一个tempHead来记录当前操作的下一个结点 //使用迭代的方法反转链表 public static ListNode reverseList(ListNode head) { ListNode pre=null;...原创 2019-04-07 13:21:26 · 653 阅读 · 0 评论 -
优秀的快速排序算法及其优化(思想+代码)Java实现
快速排序的思想是利用了分治的思想,概念就不写了,主要说几种思想,然后贴上代码二路快排思想:对于一个数组,找一个基准值,从后面找出比这个基准值小的第一个数字,从前面找比这个基准值大的数字,然后交换,在上一次的位置继续找,依旧是找会面的比基准值小的下一个,前面的比基准值大的下一个,交换,直到i>=j,这个时候找到基准值应该交换的位置,和数组中的值进行交换,然后对于左半部分和右半部分进行递...原创 2019-07-29 21:08:48 · 828 阅读 · 0 评论