- 博客(22)
- 资源 (26)
- 问答 (1)
- 收藏
- 关注
原创 堆的问题:大堆小堆都能解决LeetCode215 在数组中找第K大的元素
LeetCode215题:给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。示例1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4这个题是一道非常重要的题,主要解决方法有三个,选择法,堆排序法和快速排序法。选择法很简单,就是先遍历一遍找到最大的元素,然后再遍历一遍找第二大的,然后再遍历一遍找第三大的,直到第K次就找到了目标值了。但是这种方法只适合在面试的时候预热
2021-11-16 23:47:44 554
原创 分治7:LeetCode875. 爱吃香蕉的珂珂
这种场景题经常会在笔试中出现,整个题目有一大堆文字,给一个场景,然后让你设计模型并实现。我们一起来看看。珂珂喜欢吃香蕉。这里有N堆香蕉,第 i 堆中有piles[i]根香蕉。警卫已经离开了,将在H小时后回来。珂珂可以决定她吃香蕉的速度K(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉...
2021-11-16 00:20:38 87
原创 分治5:154. 寻找旋转排序数组中的最小值 II
这道题的题目也比较啰嗦,就是在寻找最小值的基础上又增加了一个要求:存在重复元素。还是看看完整题目要求吧。已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4] 若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n
2021-11-16 00:01:54 72
原创 分治3:关于山脉数组的两道题
在LeetCode中有两道关于山脉的问题LeetCode852和1095。通过这两个题,我可以放心的和你说,LeetCode刷完前1000道就够了,后面1500道基本不用看。1.LeetCode852. 山脉数组的峰顶索引这个题的内容表述有点啰嗦,符合下列属性的数组 arr 称为 山脉数组 :arr.length >= 3存在 i(0 < i< arr.length - 1)使得: arr[0] < arr[1] < ... arr[i-1] &l...
2021-11-15 23:52:54 338
原创 分治2:LeetCode153. 寻找旋转排序数组中的最小值
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。给你一个元素值 互不相同 的数
2021-11-15 23:38:03 96
原创 分治1:33. 搜索旋转排序数组
分治思想是一个非常重要的方法,最典型的分治就是二分查找,在长度为n的空间里,每次查找范围都减半,这样可以大大提高查找的效率。在LeetCode中有很多题目都是基于该思想,因此我们现在继续研究一些题目。LeetCode33 搜索旋转排序数组:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了循环右移,移出来的回到了左边。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋
2021-11-15 23:27:51 423
原创 滑动窗口10:存在重复元素的三个题
滑动窗口的问题还有很多,我们这里先看前面的几道,本文我们分析一个专题:存在重复元素的三道题。对应LeetCode的217,219和220三道题。在做了这三个题之后感觉有点无聊,但是吧,面试算法本来就无聊,还是一起做一做吧。LeetCode217题 给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。Leetcode219题,给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得...
2021-11-14 16:33:40 4113
原创 滑动窗口9:239. 滑动窗口最大值和480滑动窗口中位数
题目要求:给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 ...
2021-11-14 12:13:47 238
原创 滑动窗口8:75. 颜色分类-经典荷兰国旗问题
这个题是非常经典的荷兰国旗问题,我们先看一下题目要求:给定一个包含红色、白色和蓝色,一共n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。示例1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]这道题的发明者正是大名鼎鼎的荷兰计算机科学家Dijkstra,在图算法中我们会认真学习他提出的Dijkstra遍历算法。荷兰国旗图像如下:这个题...
2021-11-14 11:44:10 675
原创 滑动窗口7:Leetcode 1004. 最大连续1的个数 III
题目要求:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释: [1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。本题也是练习滑动窗口的好问题,官网的解释有点晦涩,我找到的最好的解释是这样的。这的难点在于我们可以将K个位置从0翻转成1,这里为了好处理,我
2021-11-13 23:49:45 4483
原创 滑动窗口6:LeetCode3.无重复字符的最长子串
题目要求:给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。本题的热度非常高,而且在整个LeetCode中的编号也非常靠前,所以我们看一下如何用滑动窗口解决,本题在官网的解答已经表述的很好了,我们直接抄过来吧。我们先用一个例子考虑如何在较优的时间复杂度内通过本题。我们不妨以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包...
2021-11-13 23:35:18 94
原创 滑动窗口5:LeetCode 76. 最小覆盖子串
题目要求:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。示例1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"这个题在LeetCode中标记的难度是hard,但是使用滑动窗口可以非常轻松地想到解决思路,难点在于元素可能存在重复,例如t="AAA",这时候使用Hash等辅助计算时就需要额外记录次数。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」...
2021-11-13 23:25:18 3658
原创 滑动窗口4:LeetCode209. 长度最小的子数组
题目要求:给定一个含有n个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。1.暴力计算这是一道经典的滑动窗口的问题。首先,我们留意这里说的是连续,如果忽...
2021-11-13 23:05:31 426
原创 滑动窗口3:Leetcode 11 盛水最多的容器
题目要求:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。这...
2021-11-13 22:15:56 808
原创 滑动窗口2:滑动窗口算法基本原理
学过计算机网络的同学都知道滑动窗口协议(Sliding Window Protocol),该协议是TCP协议的实现的核心策略之一,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。事实上在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题,例如hystrix、sentinel等框架都使用了这种思想。滑动窗口算法也是一种思想,是双指针的拓展和延..
2021-11-13 17:34:27 1756
原创 滑动窗口1:双指针的基本思想
1.双指针的基本思想双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。不过这里的指针并不是真正意义的指针,只是两个遍历数组的游标罢了。在链表中也可以使用双指针,定义了两个引用,也不算真正的指针。所以双指针只是一种思想的统称,没必要追究其名字。双指针有两种基本的策略,一个是快慢指针,从一头开始,一个走的快一个走
2021-11-13 17:04:50 601
原创 全面征服LeetCode-再肝200篇算法
距离上次发表100篇算法已经过去几个月了,从今天开始,再肝150篇算法,主要写高级算法问题。基础算法和高级算法什么区别呢?这个没有定论,我一般将以数据结构为基础进行简单变形得到的题目称为基础算法。而一些比较特殊的结构、比较复杂的问题,涉及一些典型思想的问题,都称为高级算法。练习算法最好的材料无疑是LeetCode,但是题目太多,一题题做要花很久的时间,所以我们还是按照专题,每次选择一些典型的题目集中分析,题目不在多,也不能太少,适中最好。目前高级算法我想到的主题如下。这个是目前大致的想法,后面会根据
2021-11-12 20:15:49 264
原创 一个通过链表构造队列的好问题
通过链表构造队列是一个算法基本功,之前我一段代码是这么写的:public class LinkQueue { private Node front; private Node rear; private int size; public LinkQueue() { this.front = new Node(0); this.rear = new Node(0); } /** * 入队 */
2021-11-09 19:03:19 562
原创 LeetCode113 路径总和II-将路径打印出来的两种方法
在上一题目中,既然找到是否存在路径了,那能把找到的路径打印出来吗?当然可以,这就是113题的要求。题目要求就不细说了,和112题完全一样,不同的是要将满足目标值的路径打印出来。我们同样可以有深度优先搜索和递归两种方式:1.深度优先法我们可以采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。class Solution { List<List<Integer>> re
2021-11-06 00:09:58 256
原创 LeetCode112. 路径总和的两种解法
题目要求:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true如果上一题做清楚了,这道题就容易很多了。我们就看一下使用递归和广度优先搜索分别怎么做。1.递归法观.
2021-11-06 00:07:44 186
原创 LeetCode257 二叉树的所有路径的四种方法
题目要求:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。示例:输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]这个题看上去还不知道怎么做是吗?我告诉你,至少有四种方法都能解决。首先,我们可以注意到右几个叶子结点,就有几条路径,那我们如何能找到叶子结点呢?深度优先、层次遍历是不是都可以?递归和迭代都可以?那组合一下自然就有很多种方式了。下面我们就认真分析每种方法的解决思路。通过本.
2021-11-05 23:59:59 786
mysql-connector-c++-8.0.23-macos10.15-x86-64bit.dmg
2021-05-10
live555.chm帮助文档
2016-09-09
QtFtp源代码
2016-07-19
qt5使用curl实现文件下载的示例程序
2016-06-20
64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver
2016-02-02
ffmpeg-2.0.tar.bz2 linux源代码
2014-05-02
vlc -1.1.7.tar.bz2 linux版源代码
2014-05-02
深度学习基础教程
2014-04-10
Geoffrey Hinton 深度学习 培训材料
2014-04-10
Handbook of Face Recognition 李子青-人脸识别技术
2014-04-10
为什么java中使用移位会出错
2022-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人