算法加数据结构
颜颜颜颜颜越
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 5893 阅读 · 5 评论 -
两个链表的第一个公共节点
题解 两个链表有第一个公共节点 我们都从头遍历这两个链表 当遍历完之后 让第一个指针指向第二个链表的头部 第二个指针指向第一个链表的头部 然后继续遍历 即两个链表 一个长 L1 一个长L2 L1 = Y + Z L2 = X + Z 第一次遍历 L1 走了 Y + Z L2 走了X + Z 然后他们交换头节点第二次遍历 如果他们存在这个公共的节点长度Z 即第二次 L1 走 X L2 走了 Y L1 走了 Y + Z + X L2 走了 X + Z + Y 如果他们存在公共节点 如果他们存在公共节.原创 2020-09-11 10:52:39 · 307 阅读 · 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 · 457 阅读 · 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 · 345 阅读 · 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 · 343 阅读 · 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 · 288 阅读 · 0 评论 -
堆排序 简单易懂
堆排序基本介绍 1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是-种选择排序,它的 最坏,最好,平均时间复杂度均为0(nlogn),它也是不稳定排序。 2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值, 称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。 3)每个结 点的值都小于或等于其左右孩子结点的值,称为小顶堆 大顶堆 小顶堆 堆排序 //堆排序 public static void heapSort(int arr[]) { in原创 2020-08-19 08:46:06 · 4455 阅读 · 1 评论 -
中序线索化二叉树及遍历实习
线索化 比较难理解的是处理后继节点 可以这么想 第一次处理前继节点,r然后游动指针再指向他的后继节点,在下一次处理后继节点。 //线索化二叉树 中序线索化 HeroNode pre = null; public void threadedNodes(HeroNode node) { //node当前需要的线索化的节点 if(node == null) { return; } // 先线索化左子树 threadedNodes(node.getLeft()); // 线索原创 2020-08-18 09:03:39 · 286 阅读 · 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 · 249 阅读 · 0 评论 -
从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。 创建一个栈,用于存储链表的节点 创建一个指针,初始时指向链表的头节点 当指针指向的元素非空时,重复下列操作: 将指针指向的节点压入栈内 将指针移到当前节点的下一个节点 获得栈的大小 size,创原创 2020-08-12 19:41:48 · 164 阅读 · 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 · 4145 阅读 · 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 · 10320 阅读 · 0 评论
分享