文章目录
- 1.4寻找两个正序数组的中位数
- 1.1.题目
- 1.2.解答
- 1.2.1.直接法:合并数组再求结果
- 1.2.2.分治:无需合并数组
- 1.2.3.log(n)的解法
- 2.5最长回文子串
- 3.10正则表达式匹配
- 3.1.题目
- 3.2.解答
1.4寻找两个正序数组的中位数
参考:力扣题目链接;参考题解
1.1.题目
1.2.解答
1.2.1.直接法:合并数组再求结果
- 时间复杂度:O(n)
- 空间复杂度:O(n)
直接给出代码如下,很简单:
// 1.真正执行数组合并
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)
{
// 初始化合并后的新数组
int size = nums1.size()+nums2.size();
vector<int> nums(size, 0);
int idx1 = 0, idx2 = 0;
for(int cur = 0; cur < size; cur++)
{
// 都没有超过索引,则判断两个数谁更小
if(idx1 < nums1.size() && idx2 < nums2.size())
nums[cur] = nums1[idx1] < nums2[idx2] ? nums1[idx1++] : nums2[idx2++];
// 否则肯定是有一个超过索引了,则只能选择剩下的没有超过索引的数组中的数
else if(idx1 < nums1.size())
nums[cur] = nums1[idx1++];
else
nums[cur] = nums2[idx2++];
}
// 合并后是奇数长度
if(size % 2)
return nums[size / 2];
// 合并后是偶数长度
return (nums[size/2 - 1] + nums[size/2]) / 2.0;
}
1.2.2.分治:无需合并数组
从上面的代码中可以发现,其实最后结果只用到了合并后数组的中间的一个或者两个数,并不用所有的数组元素。
所以这里可以修改一下代码,只记录最终要的中间的两个数,而不用存储合并后的数组。这样可以把空间复杂度降低到O(1),但是时间复杂度仍然是O(n)。
直接给出代码如下,思想和上一种解法其实是一样的。
// 2.只遍历数组(且只需要遍历一半),不进行数组合并
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)
{
// 定义两个数记录结果,因为如果有偶数个数则需要求两个数的平均
int pre = 0;
int cur = 0;
// 总长度size,遍历次数就是size/2
int size = nums1.size() + nums2.size();
int idx1 = 0, idx2 = 0; // 两个数组的索引
for(int i = 0; i <= size/2; i++)
{
// 1.更新前一个数
pre = cur;
// 2.更新当前的数
if(idx1 < nums1.size() && idx2 < nums2.size())
cur = nums1[idx1] < nums2[idx2] ? nums1[idx1++] : nums2[idx2++];
else if(idx1 < nums1.size())
cur = nums1[idx1++];
else
cur = nums2[idx2++];
}
// 如果是奇数个长度
if(size % 2)
return cur;
// 否则是偶数个长度,则返回平均值
return (pre + cur) / 2.0;
}
1.2.3.log(n)的解法
TODO:力扣要求这种解法,所以是hard难度。
2.5最长回文子串
参考:力扣题目链接;自己的博客解答
3.10正则表达式匹配
参考:力扣题目链接;参考题解