题目简介:给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
12'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *
示例 1:
12345输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 &quo...
题目简介:给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
123输入: "(()"输出: 2解释: 最长有效括号子串为 "()"
示例 2:
123输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"
思路:利用动态规划的思想,dp[i]代表以s[i]为结尾的字符串的有效括号长度。
所以以(为结尾的是不会有有效括号长度的,dp[i] = 0。
以)为结尾的有两种情况
s[i] = ')' &...
题目简介:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
12345678给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
思路:这题其实相当于给你一个中序遍历的序列,让你还原出二叉搜索树。
首先每次选择数组中间的点作为每个子树的根节点(保证左右子树的高度平衡)。
再递归构建左右子树即可。
tip:
注...
题目简介:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
示例:
1234567matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]],k = 8,返回 13。
提示:你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2。
思路:利用二分查找,下界left为矩阵中数值最小的元素为左上角元素matrix[0][0],上界right为最大的元素,即右下角元素matrix[matrix.size() - 1][matrix.s...
题目简介:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
123456输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释: 长度最长的公共子数组是 [3, 2, 1]。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
思路:使用动态规划的思想,d[i][j]代表以A[i]与B[j]为结尾的公共最长子序列。
当A[i] != B[j]时,dp[i][j] == 0
当A[i] == B[j]时,dp[i][j] == dp[i - 1]...
题目简介:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
1234输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]
示例 2:
1234输入:["CQueue","delet...
题目简介:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
12输入: [3,2,1,5,6,4] 和 k = 2输出: 5
示例 2:
12输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
思路:这题留着以后用堆排序做一遍,现在用快排两行代码解决。
代码如下:123456789class Solution {public: int findKthLargest(vector<int&g...
题目简介:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
123输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。
思路:设置双指针,起始均指向首元素,定义一个sum,表示子数组的累积和。
然后右指针开始向右移动,sum一直累加nums[right],直至sum >= s,此时左指针开始向右移动,sum依次减去nums[left],并每次保存sum >= s时的子数组长度,直至...
题目简介:给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
12输入: [1,2,0]输出: 3
示例 2:
12输入: [3,4,-1,1]输出: 2
示例 3:
12输入: [7,8,9,11,12]输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
思路:由于时间复杂度为O(n),空间复杂度为O(1),所以不能使用简单的哈希表或排序等方法。
所以我们使用置换的方法,在遍历数组时,将nums[i]放置到nums[nums[i] - 1]的位置上,比如nums[i] = 3就放置到nums[2],即nums[2] = 3。
...
题目简介:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
12输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]
示例2:
12输入:[1, 1, 1, 1, 2]输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
思路:首先先设置一个res = head来保存原始的head。
然后定义一个哈希表,遍历链表时若第一次遇到节点中的val,则存入哈希表;
否则,则一直删除节点,直至遇到不重复的节点,并把该节点的val存入哈希表。
最后返回一开始定义的res即可。
tip:
注意要将删除过程后...