LeetCode---hot100
关于LeetCode热题100解答
鲨鱼肌之王
这个作者很懒,什么都没留下…
展开
-
LeetCode---239.滑动窗口的最大值
思想:使用单调栈+滑动窗口的方式,首先先初始化一个单调递增栈这个单调递增栈的大小为k,这样可以第一个窗口中的最大值,会位于当前单调递增栈的栈顶,可以直接记录进入最终返回的vector,然后开始进行滑动窗口,设置l,r两个变量记录窗口的左右边界,分别初始化为0和k-1。申请一个双端队列,用于维护当前窗口,每次加入一个窗口元素时,都先去除掉队列中小于当前插入元素的元素,这样能够维护队列的单调性,保证最大元素一直在队头,当循环变量i到达k-1之后,每一次都需要对最终的返回vector进行插入双端队列的队头元素。原创 2024-09-28 20:24:39 · 175 阅读 · 0 评论 -
LeetCode---438.找到字符串中所有字母异位词---560.和为k的子数组
通过前缀和的概念,我们能够在一次遍历中有效地计算出和为 kk 的子数组数量。哈希表用于存储每个前缀和的出现次数,使得我们能够快速查找并更新结果。这个方法的高效性在于它避免了使用双重循环的 O(n2)O(n2) 复杂度,将其降低到 O(n)O(n)。public:// 处理和为 k 的情况// 更新当前前缀和// 检查是否存在前缀和为 currentSum - k 的情况// 更新当前前缀和的计数return ans;原创 2024-09-26 09:40:59 · 801 阅读 · 0 评论 -
LeetCode---76.最小覆盖子串
第二步:开始不断尝试收缩左边界,看是否影响windowCount包含整个子串,如果不影响则继续收缩,影响就先停止收缩。然后通过左移r,来使windowCount重新包含整个子串,重复该过程,直至完全收缩。在每次重新包含整个子串时都要对最小长度进行更新,并且记录该子串的起始位置。分别定义两个map。第一个map记为tCount,用于保存子串t的映射;第二个map记为windowCount用于保存当前窗口内的字符映射。初始化双指针l,r分别为0,用于记录当前窗口边界。O(m),保存子串t的哈希映射。原创 2024-09-29 09:13:49 · 144 阅读 · 0 评论 -
LeetCode---11.盛最多水的容器---15.三数之和
思路:先将数组进行排序之后,循环遍历数组,设置左右指针,左指针设置为当前i位置的下一个位置,设置右指针为数组的最后一个位置。开始内层循环,当三个指针的和sum为0时,保存进最终的ans数组,并且继续增大l,减小r,看是否有其他组数据能和当前i组成的和为0。为了避免重复保存,应该分别在i,l,r对应位置的元素与上一个位置的元素相同时,执行跳过操作。由于短板效应,每次测试完当前情况下的面积后,就将l,r所指向的两个板中较短的那一个板向内移动,因为只有这样,才最有可能使得下一次所盛放的水的比上一次的多。原创 2024-09-23 16:22:28 · 205 阅读 · 0 评论 -
LeetCode---3.无重复字符的最长字串
思路:使用滑动窗口的写法来写,设置一个map来存储当前窗口中已经出现的字符以及其对应的映射,初始窗口起点和最大长度均为0,然后外层循环中不断推进窗口的右端点,并且逐一更新窗口的最大值和当前存储map映射。如果在推进窗口右端点的时候,遇到重复的字符,则直接将窗口的左端点移到重复字符的下一个字符处,重新开始计算窗口。时间复杂度:O(n) (一开始以为是O(nlogn),然后突然意识到map是基于hash的,所以查找的时间复杂度应该是O(1),所以时间复杂度是O(1))原创 2024-09-25 19:52:40 · 194 阅读 · 0 评论 -
LeetCode---42.接雨水
如果 height[i]>height[top],则得到一个可以接雨水的区域,该区域的宽度是 i−left−1,高度是 min(height[left],height[i])−height[top],根据宽度和高度即可计算得到该区域能接的雨水量。显然这种方式的复杂度是O(N)。思想:由于要得到能接的雨水总量,一定是每一个bar位置所能接的雨水的总和,而对于每一个bar而言,其能接水的量无非就是该bar左右两边的bar的最小值减去当前bar的高度,决定了这个bar的位置能接多少水。原创 2024-09-24 09:58:58 · 371 阅读 · 0 评论 -
LeetCode---53.最大子数组的和
申请一个dp数组,dp[i]代表数组第i个位置的最大子数组的和,初始化dp[0] = nums[0],那么dp[1]就等于max(dp[0]+nums[1],nums[1]),由此可以推得状态方程为: dp[i] = max(dp[i-1]+nums[i],nums[i])。直接使用一个currentS来记录当前子数组的和,而每次都记录当前位置的子数组最大和,递推表达式为 currentS = max(nums[i], currentS + nums[i])。空间复杂度:O(n),dp数组所需花费。原创 2024-09-30 09:39:50 · 129 阅读 · 0 评论 -
Leetcode---128最长连续序列---283移动零
使用快慢指针的思想,遇到非零则快慢指针同时向后,遇到零快指针(i)向后。时间:O(nlogn)128-最长连续序列。原创 2024-09-22 10:06:48 · 112 阅读 · 0 评论