
数据结构和算法
文章平均质量分 59
这个名字先用着
这个作者很懒,什么都没留下…
展开
-
旋转数组的最小数字
出现这种情况的array类似[2,2,3,4,5,6,6],此时最小数字一定就是array[mid]或者在mid的左。出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid左边。出现这种情况的array类似[3,4,5,6,0,1,2],此时最小数字一定在mid的右边。注意这里有个坑:如果待查询的范围最后只剩两个数,那么mid 一定会指向下标靠前的数字。如果high = mid - 1,就会产生错误, 因此high = mid。原创 2022-12-29 19:41:01 · 626 阅读 · 0 评论 -
二分法查找波峰
在这里二段性的体现是峰值的左边单调增,右边单调减。虽然开始left和right之间可能有多个峰值,但是随着left和right不断逼近,最后两者之间一定会压缩到一个峰值上,因为两者都是向“峰”不断靠近的,但是不会超过最终的“峰”nums[mid] nums[mid + 1]说明在“下坡”,则应该使right = mid(mid可能是峰值),往“峰”处压缩。原创 2022-12-24 00:16:59 · 588 阅读 · 0 评论 -
二分查找法
这二者可能出现在不同功能的二分查找中,区别是:前者相当于两端都闭区间 [left, right],后者相当于左闭右开区间 [left, right),因为索引大小为 nums.length 是越界的。刚才明确了「搜索区间」这个概念,而且本算法的搜索区间是两端都闭的,即 [left, right]。step 2:如果中间值等于目标即找到了,可返回下标,如果中点值大于目标,说明中点以后的都大于目标,因此目标在中点左半区间,如果中点值小于目标,则相反。2. 若查找区间[low, high]不存在,则查找失败;原创 2022-12-21 22:30:36 · 199 阅读 · 0 评论 -
一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置
一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)……一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1。AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)一个长度为n的数组,将数组整体循环右移m个位置(m可能大于n)原创 2022-12-21 17:52:45 · 2398 阅读 · 0 评论 -
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素
step 4:然后输出到了右边,正好就对最右边一列从上到下输出,到底后最右边一列已经输出完了,右边界就相应往左一列,要判断左右边界是否相遇相交。step 6:然后输出到了左边,正好就对最左边一列从下到上输出,到顶后最左边一列已经输出完了,左边界就相应往右一列,要判断左右边界是否相遇相交。step 5:然后对最下面一排从右到左进行遍历输出,到达最左边后最下一排就输出完了,下边界相应就往上一行,要判断上下边界是否相遇相交。step 1:首先排除特殊情况,即矩阵为空的情况。方法二:不推荐,有很多细节要考虑。原创 2022-12-21 15:31:14 · 693 阅读 · 0 评论 -
把字符串转换成整数
把字符串转换成整数(atoi)原创 2022-12-08 23:42:57 · 2050 阅读 · 0 评论 -
字符串之第一个只出现一次的字符
描述在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)数据范围:0 \le n \le 100000≤n≤10000,且字符串只有字母组成。要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)方法一:数组巧妙利用字母的ASCII码,因为我们知道小写字母z的ASCII码值为122。所以我们可以使用计数的方法,开辟一个空间为123(数组下标从0开始)的数组,使用ASCII码(对应数组的下标)表示字母,去统计字母出现的次数。最后原创 2022-12-08 11:28:25 · 1580 阅读 · 0 评论 -
字符串之大数乘法
描述以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。数据范围: 读入的数字大小满足 0 \le n \le 10^{1000}0≤n≤101000思路一:数学模拟法代码演示:思路相当于2轮循环:第一轮相当于1235=615第二轮相当于12340 = 4920然后相加两轮结果即可;原创 2022-12-06 22:13:58 · 638 阅读 · 0 评论 -
字符串之大数加法
描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。数据范围:s.length,t.length \le 100000s.length,t.length≤100000,字符串仅由’0’~‘9’构成要求:时间复杂度 O(n)O(n)借助整型数组和模拟数学加法计算:原创 2022-12-06 13:41:47 · 287 阅读 · 0 评论 -
字符串的算法题目2-字符串
每组表示 16 比特。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。, 用(“.”)分割。原创 2022-11-22 18:32:33 · 168 阅读 · 0 评论 -
字符串的算法题目-字符串
算法原创 2022-11-17 18:46:24 · 1293 阅读 · 0 评论 -
哈夫曼树(Huffman Tree,霍夫曼树,赫夫曼树)哈夫曼编码
霍夫曼编码,赫夫曼编码:原创 2022-02-27 18:23:21 · 2361 阅读 · 1 评论 -
二叉树数据结构
二叉树代码演示遍历:原创 2022-02-24 19:25:43 · 274 阅读 · 0 评论 -
HashMap是怎么解决哈希冲突的
简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的:使用拉链法(使用链表)来链接拥有相同hash值的数据;使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;引入红黑树进一步降低遍历的时间复杂度,使得遍历更快;什么是哈希函数?Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输原创 2022-02-24 15:16:22 · 1267 阅读 · 0 评论 -
HashMap底层实现原理
HashMap中的put()和get()的实现原理:1、map.put(k,v)实现原理:(1)首先将k,v封装到Node对象当中(节点)。(2)然后它的底层会调用K的hashCode()方法得出hashcode值。(3)通过哈希表函数/哈希算法,将hashcode值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链原创 2022-02-24 13:12:41 · 505 阅读 · 0 评论 -
hashcode方法和hash方法的区别
目录hashcode概念:hashcode作用:hashcode应用场景(重点,一般面试可能会问到):Hash函数:Hash函数的应用场景:hashmap源码解析(jdk1.8):hashcode概念:根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为(hashcode)。hashcode方法是Object中的一个方法,我们的String,Integer,等都重写了此方法。且重写规则不同。如Integer的重写hashcode方法:public原创 2022-02-24 12:10:48 · 1335 阅读 · 0 评论 -
哈希表/散列表数据结构
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希冲突也叫哈希碰撞;开放地址法中(数组一个位置存一个元素),如果元素位置顺移后,原有数组位置不够了,就需要扩充数组大小,为了减少hash冲突而扩充数组容量,可能造成内存的浪费。...原创 2022-02-23 10:47:28 · 606 阅读 · 0 评论 -
集合框架底层数据结构总结
集合框架底层数据结构总结:Collection:List:ArrayList:Object数组Vector:Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)Set:HashSet(无序,唯一):基于HashMap实现的,底层采用HashMap来保存元素LinkedHashSet:LinkedHashSet继承于HashSet,并且其内部是通过LinkedHashMap来实现的。TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)。原创 2022-02-21 18:13:57 · 156 阅读 · 0 评论 -
java数据结构和算法之递归
修改走的策略:原创 2022-01-27 06:10:25 · 541 阅读 · 0 评论 -
java使用单链表模拟队列
队列简介:队列入队出队原理图:队列入队出队代码:代码演示:package com.fan.queue;//此类用来模拟队列,我们public class LinekdListAndQueue<E> { //根据队列的基本简介,需要有一个队头和队尾 //1.设置节点内为内部类,是单链表节点 private class Node<E> { //数据域,为了省略篇幅,没有用私有属性和set,get方法 E e;原创 2022-01-25 07:47:59 · 696 阅读 · 0 评论 -
java双向链表的增删改查
一、双向链表头插法:原理示意图:package com.fan.linkedlist;public class DoubLinkedListTest3 { public static void main(String[] args) { DoubLinkedList3 doubLinkedList3 = new DoubLinkedList3(); doubLinkedList3.addFirst(1,"张1"); doubLinkedLis原创 2022-01-20 03:06:36 · 692 阅读 · 0 评论 -
Java单链表头插法和尾插法以及增删改查方法
一、单链表的头插法:头插法原理图:代码演示头插法:package com.fan.linkedlist;public class SingleLInkedListDemo3 { public static void main(String[] args) { SingleLInkedList3 singlelist3 = new SingleLInkedList3(); System.out.println(singlelist3.headInsert(1)原创 2022-01-17 15:18:59 · 2121 阅读 · 0 评论 -
数据结构和算法概述
一、数据结构和算法概述:1.1 什么是数据结构:1.2 数据结构的分类:物理结构分类:顺序存储和链式存储1.3 什么是算法:以上两种算法的分析:需求二两种算法的分析:二、算法分析:1.1 算法的时间复杂度分析:测试三:算法的时间复杂度:1.2 算法的空间复杂度分析:...原创 2022-01-05 00:52:47 · 383 阅读 · 0 评论 -
队列基本使用和JUC中的队列
rear:后面,尾部front:前面,首部总结,即增加数据在队列的尾部增加,和生活中的排队一样,而取出数据是在队列的队首。方式一:使用数组来模拟队列类:代码实现:测试:原创 2021-12-23 22:46:52 · 666 阅读 · 0 评论