算法加数据结构
颜颜颜颜颜越
这个作者很懒,什么都没留下…
展开
-
Java三种方法实现队列
数组实现队列//数组实现队列class queue{ int[] a = new int[5]; int i = 0; //入队操作 public void in(int m) { a[i++] = m; }// 出队列操作 取出最前面的值 通过循环遍历把所有的数据向前一位 public int out() { int index = 0; int temp = a[0]; for(int j = 0;j < i;j++) { a[j] = a[j + 1原创 2020-09-14 10:24:49 · 5688 阅读 · 5 评论 -
两个链表的第一个公共节点
题解两个链表有第一个公共节点我们都从头遍历这两个链表 当遍历完之后 让第一个指针指向第二个链表的头部 第二个指针指向第一个链表的头部然后继续遍历即两个链表 一个长 L1 一个长L2L1 = Y + ZL2 = X + Z第一次遍历 L1 走了 Y + Z L2 走了X + Z然后他们交换头节点第二次遍历如果他们存在这个公共的节点长度Z即第二次 L1 走 X L2 走了 YL1 走了 Y + Z + XL2 走了 X + Z + Y如果他们存在公共节点如果他们存在公共节.原创 2020-09-11 10:52:39 · 197 阅读 · 1 评论 -
图的广度优先遍历(BFS)和深度优先遍历(DFS)
广度优先遍历BFS使用队列先放入A然后拿出A 把他的邻接点 B C放进队列把先进入的B的邻接点塞入队列 D队列 B C D再放入C的邻接点 E队列 B C D E然后放D的 D不存在放E的 F队列 B C D E F这样就这样保证出队的顺序符合bfs的规律(下次放入邻接的节点也和前面放入的顺序相同 放的B C下面先放的一定是B的邻接 D 再放入C的邻接E)然后出队列得到 A B C D E F深度优先遍历DFS一直走 走到无路可走 调回前一个点 看看有哪个点没走过原创 2020-09-04 13:48:50 · 324 阅读 · 0 评论 -
【2021链表面试题】环形链表(验证是否有环)
题目描述分析我们可以定义两个指针 一个快 一个慢然后遍历这个链表 如果存在环 因为一个慢一个快 必定会相遇即两个指针指向同一个节点public class Solution { public boolean hasCycle(ListNode head) { if(head == null){ return false; } ListNode p1 = head; ListNode p2 = head;原创 2020-09-01 16:39:10 · 232 阅读 · 1 评论 -
二叉排序树的创建和遍历
创建节点class Node{ int value; Node left; Node right; public Node(int value) { super(); this.value = value; } @Override public String toString() { return "Node [value=" + value + "]"; } }添加方法 遍历方法//添加节点 递归添加 需要满足二叉排序树 public void add(N原创 2020-08-27 09:21:59 · 244 阅读 · 1 评论 -
堆排序的另外一个简单的代码实现 java
首先是处理一个堆的代码方法public static void exchange(int[] arr, int i, int j) { int temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } public static void heafity(int[] arr, int i, int length) { if (i >= length) { return; } int left = i * 2 + 1; i原创 2020-08-19 09:12:54 · 196 阅读 · 0 评论 -
堆排序 简单易懂
堆排序基本介绍1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是-种选择排序,它的最坏,最好,平均时间复杂度均为0(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。3)每个结 点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆小顶堆堆排序//堆排序 public static void heapSort(int arr[]) { in原创 2020-08-19 08:46:06 · 4312 阅读 · 1 评论 -
中序线索化二叉树及遍历实习
线索化比较难理解的是处理后继节点 可以这么想 第一次处理前继节点,r然后游动指针再指向他的后继节点,在下一次处理后继节点。//线索化二叉树 中序线索化 HeroNode pre = null; public void threadedNodes(HeroNode node) { //node当前需要的线索化的节点 if(node == null) { return; } // 先线索化左子树 threadedNodes(node.getLeft()); // 线索原创 2020-08-18 09:03:39 · 210 阅读 · 0 评论 -
剑指Offer 30.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push 及pop的时间复杂度都是0(1)。解题思路:普通栈的 push() 和 pop() 函数的复杂度为 O(1)O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N)O(N) 。本题难点: 将 min() 函数复杂度降为 O(1)O(1) ,可通过建立辅助栈实现;数据栈 AA : 栈 AA 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 to原创 2020-08-13 08:45:48 · 176 阅读 · 0 评论 -
从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。创建一个栈,用于存储链表的节点创建一个指针,初始时指向链表的头节点当指针指向的元素非空时,重复下列操作:将指针指向的节点压入栈内将指针移到当前节点的下一个节点获得栈的大小 size,创原创 2020-08-12 19:41:48 · 99 阅读 · 0 评论 -
反转链表(简单易懂)
反转链表定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转局部反转完成之后, prepre 和 curcur 同时往前移动一个位置循环上述过程,直至 prepre 到达链表尾部public ListNode reverseList(ListNode head) { ListNode cur = null; ListNode pre = head; while(p原创 2020-08-12 19:39:32 · 4045 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2首先这道题我就想到了排序和map两个方法,但是排序时间复杂度高,我就使用了map解法,以下是代码 ,但是时间复杂度和空间复杂度仍然不低public int majorityElement(int[] nums) { int len原创 2020-08-12 08:54:25 · 10254 阅读 · 0 评论