LeetCode 热题 10. 正则表达式匹配 11. 盛最多水的容器 15. 三数之和

10.正则表达式匹配

力扣10

思路:

我觉得这题有问题()

这个是样例的说明:

输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。

 但是!

 为什么这个就不行了呢。。

如果说必须s和p的长度也相等的话,

"aab"

"c*a*b"

这个又是true

总之就不太理解题目什么意思了= =

11.盛水最多的容器

力扣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.三数之和

力扣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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值