
刷题记录
深海HelloWorld
这个作者很懒,什么都没留下…
展开
-
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 · 273 阅读 · 0 评论 -
LeetCode 215 数组中的第K个最大元素
LeetCode 215 数组中的第K个最大元素题目:中等给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。思路:方式一:快排先对原数组采用快排方式排序(由小到大),再返回倒数第K个数,时间复杂度为O(nlogn)优化:快排中的partition函数返回值为,在调整数组的元素使得左边的元素都小于它,右边的元素都等于它,中间的元素都等于它后,返回中间那段区间的起始结束下标p[]。通过将k与p原创 2021-11-29 21:52:25 · 271 阅读 · 0 评论 -
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 · 220 阅读 · 0 评论 -
剑指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 · 455 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
剑指 Offer 51. 数组中的逆序对题目:困难在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:归并此题和最小和问问题,思路一致,最小和问题找当前元素右侧大于此元素的元素个数,逆序对问题找当前元素右侧小于此元素的元素个数按递减归并排序,当左右相等时,先将右侧的加入temp中,因为右侧为递减序,不知道右侧下一个元素会不会比左侧元素小sum += arr[p1] <= arr[p2]?0:right-p2+原创 2021-11-27 13:37:42 · 99 阅读 · 0 评论 -
面试题 小和问题
面试题 小和问题题目:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和例子:[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 · 577 阅读 · 0 评论 -
面试题 求最大长度自然序子序列,输出长度和子序列下标
面试题 求最大长度自然序子序列,输出长度和子序列下标(从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 · 1023 阅读 · 0 评论 -
面试题:寻找字符串中出现频次最高且最先出现的字符
面试题:寻找字符串中出现频次最高且最先出现的字符题目:假设有一个字符串,字符串内部的所有字符都是在ascii编码的范围内,编码求出字符串中出现频率最高的字符,如果频率最高的字符有几个字符出现的频率一样,则输出最先出现的字符。如输入串为"hello world,every body!",则输出频率最高且最先出现的字符’e’方法定义:char getMaxOccurChar(String str)思路:new一个容器,保存每个字符出现的次数,动态更新最高次数;由于题目要求且最早出现的字符,因此采用原创 2021-11-26 20:54:17 · 801 阅读 · 0 评论 -
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 · 1509 阅读 · 0 评论 -
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 · 119 阅读 · 0 评论 -
LeetCode 684 冗余连接
LeetCode 684 冗余连接题目:中等思路:涉及到图论,想到并查集具体的,初始时,每个节点都属于不同集合,遍历每一条边,判断这条边所连接的两个顶点是否属于同一集合若不属于同一集合,则说明在遍历到当前边之前,两节点不连通,因此当前边不会导致环出现,进而将两个点合并为一个集合。若属于同一集合,则说明在遍历到当前边之前,两节点已经连通,因此当前边会导致环出现,此时应将当前边作为结果返回。class Solution{ public static class Element{ pu原创 2021-11-24 22:34:08 · 210 阅读 · 0 评论 -
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 · 199 阅读 · 0 评论