LeetCode74 - 数组中的第K个最大元素
📝 题目描述 题目链接:数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n)O(n)O(n) 的算法解决此问题。 示例: 123456789示例 1:输入: [3,2,1,5,6,4], k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6], k = 4输出: 4 提示: 1 <= k <= nums.length <= 10^5 -10^4 <= nums[i] <= 10^4 💡 解题思路 方法一:快速选择算法 利用了快速排序(Quick Sort)的 partition(划分)思想。 思路: 随机选择一个基准元素(pivot),将数组划分为两部分:左边的元素都大于 pivot,右边的元素都小于 pivot(降序划分)。 划分结束后,pivot 会落在一个确定的索引 p 上。 比较 p 和目标索引 k - 1: 如果 p == k - 1...
LeetCode73 - 柱状图中最大的矩形
📝 题目描述 题目链接:柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例: 示例 1: 123输入:heights = [2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为 10 示例 2: 12输入: heights = [2,4]输出: 4 提示: 1 <= heights.length <=10^5 0 <= heights[i] <= 10^4 💡 解题思路 方法一:单调栈 这个题跟接雨水比较相像,接雨水要找出一个柱子左右两边第一个大于该柱子高度的柱子,本题是找每个柱子左右两边第一个小于该柱子的柱子。 本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序。 为了不再判断特例,可以设置两个哨兵节点,也就是高度为 0 的柱子到题目数组的两边,以便于我们及时将所有元素出栈。 维护一个非严格单调递增栈: 栈非空且当前遍历到的元素 heights[i] ...
LeetCode72 - 每日温度
📝 题目描述 题目链接:每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例: 1234567891011121314示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]示例 2:输入: temperatures = [30,40,50,60]输出: [1,1,1,0]示例 3:输入: temperatures = [30,60,90]输出: [1,1,0] 提示: 1 <= temperatures.length <= 10^5 30 <= temperatures[i] <= 100 💡 解题思路 方法一:单调栈 维护一个存储温度下标的栈,从栈底到栈顶,所索引的温度是递减的。 倒序遍历温度数组(倒序入栈 相当于 正序出栈),对于每一个索引 i: 只要栈不空,那么查看 temp...
LeetCode71 - 字符串解码
📝 题目描述 题目链接:字符串解码 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 测试用例保证输出的长度不会超过 10^5。 示例: 12345678910111213141516171819示例 1:输入:s = "3[a]2[bc]"输出:"aaabcbc"示例 2:输入:s = "3[a2[c]]"输出:"accaccacc"示例 3:输入:s = "2[abc]3[cd]ef"输出:"abcabccdcdcdef"示例 4:输入:s = "abc3[cd]xyz"输出:&quo...
LeetCode70 - 最小栈
📝 题目描述 题目链接:最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。 示例: 123456789101112131415161718示例 1:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,null,0,-2]解释:MinStack minStack = new MinStack();minStack.push...
LeetCode69 - 有效的括号
📝 题目描述 题目链接:有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例: 1234567891011121314151617181920212223242526272829示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([])"输出:true示例 5:输入:s = "([)]"输出:false 提示: 1 <= s.length <= 10^4 s 仅由括号 '()[]{}' 组成 💡 解题思路 方法一:栈 思路很简单,遇见左括号,直接入栈;遇见右括号: 判断栈是否为空,为空则说明上来就是右括号,直接返回 fal...
LeetCode68 - 寻找两个正序数组的中位数
📝 题目描述 题目链接:寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数。 算法的时间复杂度应该为 O(log(m+n))O(log(m+n))O(log(m+n))。 示例: 1234567891011示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 提示: nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -10^6 <= nums1[i], nums2[i] <= 10^6 💡 解题思路 方法一:二分查找 把时间复杂度降低到 O(log(m+n...
LeetCode67 - 寻找旋转排序数组中的最小值
📝 题目描述 题目链接:寻找旋转排序数组中的最小值 已知一个长度为 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]] 。 给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须设计一个时间复杂度为 O(logn)O(log n)O(logn) 的算法解决此问题。 示例: 1234567891011121314151617示例 1:输入:nums = [3,4,5,1,2]输出:1解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。示例 2:输入:nums = [4,5,...
LeetCode66 - 搜索旋转排序数组
📝 题目描述 题目链接:搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如,[0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2]。 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。 你必须设计一个时间复杂度为 O(logn)O(log n)O(logn) 的算法解决此问题。 示例: 1234567891011121314示例 1:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2:输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1示例 ...