算法
xiaofang233
开源互联网技术追随者、狂热者。
展开
-
leetcode136-只出现一次的数字
# 题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。**说明:**你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?# 解题思路如果没有时间复杂度和空间复杂度的限制,这道题有很多种解法,可能的解法有如下几种。- 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。- 使用哈希表存储每个数字和该数字原创 2020-09-29 12:08:56 · 134 阅读 · 0 评论 -
剑指offer—两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共节点。解题思路我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。这样,当它们相遇时,所指向的结点就是第一个公共结点。参考代码/** * Definition for singly-linked list. * pub原创 2020-09-28 04:20:02 · 107 阅读 · 0 评论 -
leetcode236-二叉树的最近公共祖先
题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。解题思路1、递归复杂度分析时间复杂度:O(N),其中N是二叉树的节点数。二叉树的所有节点有且只会被访问一次,因此时间复杂度为 O(N)。空间复杂度:O(N),其中 N 是二叉树的节点数。递归调用的栈深度取决于二叉树的高度,二叉树最坏情况下为一条链,此时高度为 N,因此空间复杂度为 O(N)。2、存储父节点我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p 结点开始不断往上跳,并记录已经访原创 2020-09-25 02:34:01 · 192 阅读 · 1 评论 -
leetcode141-判断链表是否有环
题目描述判断给定的链表中是否有环解题思路1、借助哈希表我们可以通过检查一个结点此前是否被访问过来判断链表是否为环形链表。常用的方法是使用哈希表。我们遍历所有结点并在哈希表中存储每个结点的引用。如果当前结点为空结点 null(即已检测到链表尾部的下一个结点),那么我们已经遍历完整个链表,并且该链表不是环形链表。如果当前结点的引用已经存在于哈希表中,那么返回 true(即该链表为环形链表)。2、双指针法想象一下,两名运动员以不同的速度在环形赛道上跑步会发生什么?通过使用具有不同速度的快、慢两个指原创 2020-09-15 09:28:45 · 246 阅读 · 0 评论 -
剑指offer—树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路1)先对A树进行遍历,找到与B树的根结点值相同的结点R;2)判断A树中以R为根结点的子树是否包含B树一样的结构。参考代码public class Solution{ public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2020-09-14 00:50:14 · 82 阅读 · 0 评论 -
剑指offer—合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现:当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接。非递归实现:非递归实现比较容易想到,直接进行分情况讨论即可,要稍微注意下后面代码中头结点的赋值过程。参考代码//题目:输入两个递增排序的链表,合并这两个链表原创 2020-09-13 01:24:20 · 139 阅读 · 0 评论 -
剑指offer—链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针刚好指向倒数第k个节点。关注要点链表头指针是否为空,若为空则直接返回回null。k是否为0,k为0也就是要查找倒数第0个节点,由于计数一般是从1开始的,所有输入0没有实际意义,返回null。k是否超出链原创 2020-09-10 00:52:07 · 73 阅读 · 0 评论 -
图的最短路径问题—迪杰斯特拉算法
算法介绍迪杰斯特拉算法的本质,是不断刷新起点与其他各个顶点之间的 “距离表”。算法实现mport java.util.*;import java.lang.Integer;public class Dijkstra { public static Map<Integer, Integer> dijkstra(Graph graph, int startIndex) { //创建距离表,存储从起点到每一个顶点的临时距离 Map<Intege原创 2020-08-18 11:19:20 · 204 阅读 · 0 评论 -
动手实现一个 LRU Cache
LRU算法LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”,通常用于缓存的淘汰策略实现。...原创 2020-08-18 10:20:50 · 255 阅读 · 0 评论 -
数据结构、raft算法演示工具、golang、电子书、并发外文
https://blog.csdn.net/nmjhehe/article/details/97431021原创 2019-09-16 23:23:20 · 973 阅读 · 0 评论