
数据结构和算法
迎风追日
9 年软件开发经验,其中 3 年的项目开发负责人经验,擅长 java web 平台的开发,多年云计算、大数据领域面向教育、公安类 SaaS 应用开发背景;具有较强的业务分析能力,能够快速理解和分析复杂的业务逻辑;有较强的沟通协作能力,有异地开发经历;有较强的学习能力,且愿意尝试新技术。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode算法题解: 3. 无重复字符的最长子串
【代码】LeetCode算法题解: 3. 无重复字符的最长子串。原创 2025-03-30 17:19:21 · 131 阅读 · 0 评论 -
Redis的SortedSet为什么使用跳表而不使用红黑树?
为什么 Redis 要用跳表来实现有序集合,而不是红黑树?Redis 中的有序集合是通过跳表来实现的,严格点讲,其实还用到了散列表。如果你去查看 Redis 的开发手册,就会发现,Redis 中的有序集合支持的核心操作主要有下面这几个:插入一个数据;删除一个数据;查找一个数据;按照区间查找数据(比如查找值在 [100, 356] 之间的数据);迭代输出有序序列。其中...原创 2020-01-13 15:26:10 · 1959 阅读 · 0 评论 -
求数组中第二大的数字
private static int secondMax(int[] arr) { int len = arr.length; int max = Integer.MIN_VALUE, secondMax = Integer.MIN_VALUE; if (len < 2) return secondMax; for (int i = 0; i <...原创 2020-01-05 12:40:43 · 470 阅读 · 0 评论 -
字符串按照字母表顺序排序
private static String sortString2(String string){ char[] str=string.toCharArray(); int n = string.length(); boolean flag = false; for(int i=0;i< n - 1;i++) { ...原创 2020-01-01 20:14:49 · 4801 阅读 · 1 评论 -
二叉树与散列表的比较
散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn),相对散列表,好像并没有什么优势,那我们为什么还要用二叉查找树呢?我认为有下面几个原因:第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内...原创 2019-12-21 11:55:03 · 601 阅读 · 2 评论 -
在整数数组中找第二大的数
public static int getSecondMax(int[] a) throws Exception { if(a == null || a.length <=1){ throw new Exception("没有第二大的值"); } int max1=Integer.MIN_VALUE,max2=Inte...原创 2019-03-08 15:38:27 · 529 阅读 · 0 评论 -
数据结构和算法笔记
1、红黑树红黑树是一种平衡二叉查找树,它是为了解决普通二叉查找树在数据更新过程中,复杂度退化的问题而产生的。红黑树的高度近似log2n,所以它是近似平衡,插入、删除、查找的时间复杂度都是O(logn)。2、B+树正是因为要时刻保证 B+ 树索引是一个 m 叉树,所以,索引的存在会导致数据库写入的速度 降低。实际上,不光写入数据会变慢,删除数据也会变慢。这是为什么呢? 我们在删除某个数据...原创 2019-02-13 08:52:24 · 283 阅读 · 0 评论 -
哈希表以及哈希算法的应用
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数 组演化而来。可以说,如果没有数组,就没有散列表。两种主要的散列冲突的解决办法,开放寻址法和链表法。这两种冲突解决办法在实际的软件开发中都非常常用。比如,Java 中 LinkedHashMap 就采用了链表法解决冲突,ThreadLocalMap 是通过线性探测的开放寻址法来解决冲突。当数据量比较小、装...转载 2019-01-14 19:47:25 · 419 阅读 · 0 评论 -
【链表算法 leetcode】删除链表中等于给定值 val 的所有节点
删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5/** * Definition for singly-linked list. * public class ListNode { * int val;...原创 2018-12-24 07:50:48 · 419 阅读 · 0 评论 -
常见链表相关算法-java语言实现
本文将介绍: 单链表反转 求中间节点 删除倒数第K个节点 合并两个有序链表 检测环,并找到入口点 两个单链表相交的起始节点 奇偶链表 回文链表Node定义:public static class Node { private int data; private Node next; public Node(int data, Nod...原创 2018-11-12 15:01:37 · 1079 阅读 · 0 评论 -
链表算法--检测环
给定一个单链表,判断其中是否有环,已经是一个比较老同时也是比较经典的问题,在网上搜集了一些资料,然后总结一下大概可以涉及到的问题,以及相应的解法。 首先,关于单链表中的环,一般涉及到一下问题:1.给一个单链表,判断其中是否有环的存在;2.如果存在环,找出环的入口点;3.如果存在环,求出环上节点的个数;4.如果存在环,求出链表的长度;5.如果存在环,求出环上距离任意一...转载 2018-11-14 08:46:06 · 342 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量; 而空间复杂度是指执行这个算法所需要的内存空间。 (算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。简单来说,时间复杂度指的是语句执行次数,空间复杂度指的是算法所占的存储空间时间复杂度 计算时间复杂度的方法:用常数1代替...转载 2018-07-06 11:54:37 · 391 阅读 · 0 评论 -
动态规划法--0/1背包问题
问题描述有n个物体,重量分别是w0~wn-1,每个物体放入背包后可获得的收益分别为p0~pn-1,背包载重为M,且所有物体要么放要么不放,不能只放一部分。求如何放物体可以得到最高的收益。问题分析设f(i,m)表示第i步背包的总收益,其中i表示当前进行到了第i步,m为当前背包载重,则当前第i步只有两种选择:将第i个物体放入背包 此时背包总收益就变成f(i-1,m-wi)+wi。第i个物体不放入背包 ...转载 2018-06-26 10:07:03 · 328 阅读 · 0 评论 -
贪心算法--一般背包问题
题目有一个背包,最多放M kg的物体(物体大小不限); 有n个物体,每个物体的重量为Wi,每个物体完全放入背包后可获得收益Pi。问:如何放置能获得最大的收益?注:背包问题分为两种,若每个物体不可分割,则称为0/1背包问题,这种问题无法用贪心法求的最优解,只能求的近似解。而若每个物体可以切分,则称为一般背包问题,可以使用贪心法求的最优解。下面讨论的就是一般背包问题。结果集一般背包问题中,结果集可以用...转载 2018-06-25 17:22:54 · 1984 阅读 · 0 评论 -
数据结构与算法--从一百万个数字中得到前10大的数
1. 算法如下:根据快速排序划分的思想 (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区...转载 2018-06-10 21:01:42 · 3472 阅读 · 0 评论 -
数据结构和算法--冒泡排序和选择排序
冒泡排序法概念: 从前向后(或从后向前)依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,像水底的气泡逐渐向上冒,顾名思义冒泡排序法。 通俗一点就是把大的往上挪!向冒泡一样。 是交换式排序法的一种。冒泡排序法效率较低。 冒泡排序法思路1:外层循环:控制它要走几次。 假设你有5个数,那就要走4次,最后一次不用走,最后那个数已经在它位置了所以就要length-1次。 2:内层循环:控制...转载 2018-06-10 20:52:27 · 204 阅读 · 0 评论