自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 问答 (1)
  • 收藏
  • 关注

原创 Leetcode 1277 统计全为1的正方形子矩阵

Leetcode 1277 统计全为1的正方形子矩阵题目:中等给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。思路:动态规划递推公式推导如下:(参考LeetCode官方题解)用 f[i][j] 表示以 (i, j) 为右下角的正方形的最大边长,那么除此定义之外,f[i][j] = x 也表示以 (i, j) 为右下角的正方形的数目为 xf[i][j] 与相邻位置的关系如上图所示,若对于位置 (i, j) 有 f[i]

2021-11-30 15:50:25 179

原创 LeetCode 215 数组中的第K个最大元素

LeetCode 215 数组中的第K个最大元素题目:中等给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。思路:方式一:快排先对原数组采用快排方式排序(由小到大),再返回倒数第K个数,时间复杂度为O(nlogn)优化:快排中的partition函数返回值为,在调整数组的元素使得左边的元素都小于它,右边的元素都等于它,中间的元素都等于它后,返回中间那段区间的起始结束下标p[]。通过将k与p

2021-11-29 21:52:25 198

原创 LeetCode 146. LRU 缓存机制

LeetCode 146. LRU 缓存机制题目:中等运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字

2021-11-29 12:35:05 136

原创 剑指Offer II 060 出现频率最高的K个数字 Leetcode 692. 前K个高频单词

剑指Offer II 060 出现频率最高的K个数字题目:给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。思路:堆排 + HashMap出现频率最高的K个数字,第一反应 堆排用HashMap存储数字及统计其出现次数难点:如何将Map中的次数利用堆排进行排序,并取到最高的K个数字方案:建一个小根堆,存储元素为二维数组,arr[0]为数字,arr[1]为其出现次数,自定义比较器,按出现次数对元素进行升序排列;遍历HashMap,将E

2021-11-27 23:04:52 382

原创 堆排序汇总

堆排序汇总堆结构就是用数组实现的完全二叉树结构,底层结构是数组大根堆:在完全二叉树中,每棵子树的最大值都在顶部小根堆:在完全二叉树中,每棵子树的最小值都在顶部优先队列就是堆结构1、如何让数组变为堆结构?方式一:heapInsert,将元素与父节点进行比较,如果比父节点大,则交换,直到当前元素达到根节点,或比自己的父节点小为止public static void heapInsert(int[] arr,int index){ while(arr[index] > arr[(in

2021-11-27 21:14:46 303

原创 剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对题目:困难在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:归并此题和最小和问问题,思路一致,最小和问题找当前元素右侧大于此元素的元素个数,逆序对问题找当前元素右侧小于此元素的元素个数按递减归并排序,当左右相等时,先将右侧的加入temp中,因为右侧为递减序,不知道右侧下一个元素会不会比左侧元素小sum += arr[p1] <= arr[p2]?0:right-p2+

2021-11-27 13:37:42 54

原创 面试题 小和问题

面试题 小和问题题目:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和例子:[2,5,4,2]2左边比2小的数:没有5左边比5小的数:24左边比4小的数:22左边比2小的数:没有小和为2+2 = 4思路:归并小和问题等价于找数组中每一个元素右侧有几个比当前数大的元素,sum=a[0]*num1+a[1]*num2…可以通过归并的思想,先分解,再merge。分解至单个元素,在合并的过程中记录每个元素右侧大于当前元素的个数特别地,当左右相等的时候,

2021-11-27 12:46:12 522

原创 面试题 求最大长度自然序子序列,输出长度和子序列下标

面试题 求最大长度自然序子序列,输出长度和子序列下标(从1开始)思路:将数组升序排序,枚举数组中的每个数 x,考虑以其为起点,不断尝试匹配 x+1, x+2,⋯ 是否存在,假设最长匹配到了 x+y,那么以 x 为起点的最长连续序列即为 x, x+1, x+2,⋯,x+y,其长度为 y+1 for循环套while循环实现要枚举的数 x 一定是在数组中不存在前驱数 x-1 的,否则x-1为起点的子序列长度必大于以x为起点的子序列,此功能可用HashSet实现由于需要输出子序列下标,则在排序之前,用H

2021-11-26 21:36:42 907

原创 面试题:寻找字符串中出现频次最高且最先出现的字符

面试题:寻找字符串中出现频次最高且最先出现的字符题目:假设有一个字符串,字符串内部的所有字符都是在ascii编码的范围内,编码求出字符串中出现频率最高的字符,如果频率最高的字符有几个字符出现的频率一样,则输出最先出现的字符。如输入串为"hello world,every body!",则输出频率最高且最先出现的字符’e’方法定义:char getMaxOccurChar(String str)思路:new一个容器,保存每个字符出现的次数,动态更新最高次数;由于题目要求且最早出现的字符,因此采用

2021-11-26 20:54:17 690

原创 Arrays.sort()及自定义比较器

Arrays.sort()及自定义比较器在自定义比较器,重写compare方法时,return正值,返回后一个元素;return负值,返回前一个元素;return 0,两个元素顺序不变。public class Example{ public static class Student{ int classNo; int age; public Student(int classNo,int age){ this.classNo = classNo; this.age = a

2021-11-25 11:17:53 1394

原创 LeetCode 1103 分糖果II

LeetCode 1103 分糖果II题目:简单思路:暴力求解具体的,只要还有糖就一直分,直到糖分完为止。class Solution{ public int[] distributeCandies(int candies,int num_people){ int[] arr = new int[num_people]; int i = 0; while(candies != 0){ arr[i%num_people] += Math.min(candies,i+1);//防

2021-11-24 22:46:05 75

原创 LeetCode 684 冗余连接

LeetCode 684 冗余连接题目:中等思路:涉及到图论,想到并查集具体的,初始时,每个节点都属于不同集合,遍历每一条边,判断这条边所连接的两个顶点是否属于同一集合若不属于同一集合,则说明在遍历到当前边之前,两节点不连通,因此当前边不会导致环出现,进而将两个点合并为一个集合。若属于同一集合,则说明在遍历到当前边之前,两节点已经连通,因此当前边会导致环出现,此时应将当前边作为结果返回。class Solution{ public static class Element{ pu

2021-11-24 22:34:08 108

原创 LeetCode 135 分发糖果

LeetCode 135 分发糖果题目:困难左右坡二次遍历,取最大值思路:先求每一个值的左坡高度,再求每一个值的右坡高度,二者取大值具体的,以求左坡高度为例,left[0]=1,i从1开始遍历,到n-1结束,假设前遍历到位置i,若ratings[i]>ratings[i-1],则left[i]=left[i-1]+1,否则令left[i]=1。进一步,优化空间复杂度,可以用单个变量代替right数组class Solution { public int candy(int[]

2021-11-24 22:02:21 163

原创 获取HashSet中的元素

//第一种方法 if(!set.isEmpty()){ System.out.println(set.iterator().next());// 1.2 } //第二种方法:将set集合转换成list集合 取第一个 List list = new ArrayList(set); System.out.println(list.get(0));// 1.2}...

2021-10-22 10:19:43 10242

原创 学习笔记|算法——广度优先搜索算法(BFS)

广度优先搜索算法(BFS)一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。主要依靠三个变量:visited、queue、prevvisited记录已经被访问的顶点,避免顶点被重复访问queue是一个队列(主要利用队列先进先出的特性),用来存储已被访问、但相连的顶点还没有被访问的顶点。作用:当访问到第K层的顶点时,将第K层顶点记录下来,稍后通过第K层的顶点找第K+1层的顶点。int w = queue.poll();for(int i = 0;i<a

2021-05-08 09:56:23 162

原创 学习笔记|数据结构——二叉树

学习笔记|数据结构——二叉树树每个元素叫做”节点“;用线连接的相邻节点之间的关系,叫作父子关系父节点是同一个节点的一群节点互称为兄弟节点没有父节点的节点叫作根节点没有子节点的节点叫作叶子节点节点的高度:节点到叶子节点的最长路径(边数)节点的深度:根节点到这个节点所经历的边的个数节点的层数:节点的深度+1树的高度:根节点的高度,即叶节点到根节点的最长路径高度这个概念可以想象成楼的高度,是从下往上数的,树的高度也是一样,从最底层开始计数,并且计数的起点是0深度这个概念可以想想成水中鱼的深

2021-03-26 14:35:12 420

原创 学习笔记|数据结构——哈希算法

学习笔记|数据结构——哈希算法哈希算法将任意长度的二进制值串映射为固定长度的二进制值串,映射规则是哈希算法通过原始数据映射之后得到的二进制值码就是哈希值哈希算法要求:1、从哈希值不能反向推导出原始数据2、对输入数据非常敏感,原始数据即使只修改一个bit,最后得到的哈希值也大不相同3、散列冲突的概率要很小4、执行效率要尽量高效,针对较长文本,能快速计算哈希值哈希算法的应用根据鸽巢原理,哈希算法无法做到零冲突应用:唯一标识以图片为例,可以从图片的二进制码的不同位置中取n个字节,通过哈希算

2021-03-25 10:03:35 233

原创 学习笔记|数据结构——LinkedHashMap 散列表+链表

学习笔记|数据结构——LinkedHashMap 散列表+链表LinkedHashMap是通过双向链表和散列表这两种数据结构组合实现的可以将其想象成一个双向链表,可以快速按顺序遍历,将这一串元素(在不打破双向链表连接)的前提下,将一串元素放到散列表中,这样,在查询的时候就可以通过散列表来操作,遍历的时候通过双向链表来操作散列表的优点:支持O(1)时间复杂度的数据插入、删除、查找操作散列表缺点:存储的数据都是无规律存储,无法快速遍历数据此时可以加入链表结构,链表可以做到快速遍历,时间复杂度是O(1)

2021-03-24 14:23:25 447

原创 学习笔记|数据结构——散列表

学习笔记|数据结构——散列表散列表利用数组支持下表随机访问数据,时间复杂度为O(n)的特性,对数组进行扩展思想:通过散列函数将元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。按照键值查询元素时,用同样的散列函数,将键值转化为数组下标,从对应的数组下标的位置取数据举例:存在90名选手,想通过编号快速找到对应选手信息。利用散列思想,将参赛选手的编号当作键(key)或者关键字。用来标识一个选手。==把参赛编号转化为数组下标的映射方法叫做散列函数(哈希函数),散列函数计算得到的值叫做散列值(哈希

2021-03-23 16:57:49 558

原创 学习笔记|数据结构——跳表

学习笔记|数据结构——跳表跳表:链表加多级索引的动态数据结构插入、删除、查找时间复杂度:O(logn)空间复杂度:O(n)思想:空间换时间,对链表建议一级索引,每n个节点提取一个节点到上一级,把抽出来的那一级叫做索引层,通过down指针指向下一级结点举例:比如要查找节点10,现在索引层遍历,当遍历到索引层值为9的节点时,下一个节点是13,那要查找的元素在下一层中,通过forwards[–i]跳到下一层,继续遍历,直到找到10。某种意义上也是分治分区思想,先将链表分成几个大区,通过一次次筛选区,

2021-03-22 22:33:38 118

原创 学习笔记|数据结构——队列

学习笔记|数据结构——队列具象理解把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出。本质是一种操作受限的线性表数据结构基本操作:入队,放一个数据到队列尾部;出队,从队列头部取一个元素用数组实现的队列叫做顺序序列;用链表实现的队列叫做链式队列顺序队列需要两个指针:一个是head指针,指向队头;一个是tail指针,指向队尾tail指针指向最后一个元素后边的位置优化队列操作对于顺序队列,当删除某个元素后,会导致数组中的数据不连续,需要进行数据搬移,若删除一个,搬移一

2021-03-20 20:34:26 203

原创 学习笔记|数据结构——二分查找

学习笔记|数据结构——二分查找核心思想:针对有序得数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素比较(当区间元素为偶数个时,中间数有两个,选择较小的那个),将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0时间复杂度分析假设数据大小是n,每次查找后数据都会缩小为原来的一半,也就是会除以2。最坏情况下,直到查找区间被缩小为空,才停止当区间缩小为1时,即n/2k=1时,k值就是总共缩小的次数,在缩小之前会做一次数据大小比较,所以经过k次区间缩小,时间复杂度就是O

2021-03-20 19:48:29 371

原创 学习笔记|数据结构——桶排序、计数排序、基数排序

学习笔记|数据结构——桶排序、计数排序、基数排序桶排序、基数排序、计数排序的时间复杂度是O(n),因此称之为线性排序三种算法都是基于非比较的排序算法,都不涉及元素之间的比较操作,重点是掌握这些排序算法的使用场景桶排序核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了时间复杂度分析:如果要排序的数据有n个,把他们均匀的划分到m个桶内,每个桶里有k=n/m个元素。每个桶内部使用快速排序,时间复杂度位O(

2021-03-18 20:31:18 402

原创 学习笔记|数据结构——排序

学习笔记|数据结构——排序分析排序算法好坏1、算法执行效率最好情况、最坏情况、平均情况时间复杂度,同时要给出不同情况对应的原始数据是如何的时间复杂度的系数、常数、低阶,当排序规模很小时,要把上述几项考虑进来比较次数和交换次数2、排序算法内存消耗原地排序算法,特指空间复杂度是O(1)的排序算法3、排序算法的稳定性如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变,即称为稳定性稳定性算法的实际应用:在电商订单系统中,希望按照金额大小进行排序,对同等金额的订单按下

2021-03-16 22:19:37 114

原创 学习笔记|数据结构——递归

学习笔记|数据结构——递归1、递归定义方法或函数调用自身的方式成为递归调用去的过程叫“递”,回来的过程叫“归”2、递归需要满足的条件1、一个问题可以分解为数据规模更小的问题。比如阶乘,只需要计算本身的值和前一个数的乘积2、分解后的子问题,除数据规模不一样,求解思路完全相同。3、存在递归终止条件。一般用 if() return… 来返回最初的几个特殊值因此,编写递归程序最关键的是写出递推公式,找到终止条件,剩下将地推公式转换为代码就简单了典型问题爬楼梯问题首先找到某一层与之前一层的关

2021-03-15 21:53:39 328

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除