10.正则表达式匹配
思路:
我觉得这题有问题()
这个是样例的说明:
输入:s = "ab", p = ".*" 输出:true 解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
但是!
为什么这个就不行了呢。。
如果说必须s和p的长度也相等的话,
"aab"
"c*a*b"
这个又是true
总之就不太理解题目什么意思了= =
11.盛水最多的容器
思路:
暴力可以过。
定义一个头和一个尾,计算面积,不断更新最大面积。
因为面积与高度是有关系的,所以当头的高度小的时候,头往后走,当尾的高度小的时候,尾往前走,直到它们相遇。
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int a=0,b=height.size()-1;
int sum=0;
while(a<b)
{
sum=max(sum,min(height[a],height[b])*(b-a));
if(height[a]<height[b])a++;
else b--;
}
return sum;
}
};
15.三数之和
思路:
暴力不能解决。
优化一下,其实思路还是暴力的思路,只是不再用三重循环了。
第一层循环确定一个数字,然后用双指针来遍历后边的数字。所以在这之前要对vector进行排序。
有一个坑点是C++要注意指针的位置,所有的判断要先判断边缘。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> >v;
if(nums.size()<3)return v;
if(nums.size()==3){
if(nums[0]+nums[1]+nums[2]==0){
v.push_back(nums);
}
}
else{
vector<int> vv;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0)return v;
if(i>0&&nums[i]==nums[i-1])continue;
int l=i+1;
int r=nums.size()-1;
while(l<r)
{
if(nums[i]+nums[l]+nums[r]==0){
vv.push_back(nums[i]);
vv.push_back(nums[l]);
vv.push_back(nums[r]);
v.push_back(vv);
vv.clear();
while(l+1<nums.size()&&nums[l]==nums[l+1])l++;
while(r-1>0&&nums[r]==nums[r-1])r--;
l++;
r--;
}
else if(nums[i]+nums[l]+nums[r]>0)r--;
else l++;
}
}
}
return v;
}
};