leecode 贪心

这篇博客介绍了LeetCode上的三个算法问题:455题(分配饼干)、11题(盛最多水的容器)和409题(最长回文串)。对于每道题目,博主提供了详细的思路解析,包括双指针法和暴力求解等解决方案,并给出了具体的C++代码实现。此外,还特别提到了在409题中需要注意的特殊情况处理。
摘要由CSDN通过智能技术生成

leecode.455发放饼干 简单

题目:

思路:用最小尺寸去满足最大胃口的孩子 能满足就+1

代码:

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {

        //排序
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());

        //最小尺寸去满足最大胃口的孩子 能满足就+1
        int g_size = g.size();//胃口数量
        int s_size = s.size();//饼干数量
        int num = 0;//能满足的数量

        for(int i = 0;i < s_size;i++)
        {
            for(int j = g_size-1;j>=0;j--)
            {
                if(g[j] != 0 && s[i] >= g[j])
                {
                    num++;
                    g[j] = 0;
                    break;
                }
            }
        }
        return num;

    }
};

leecode.11 盛最多水的容器  中等

思路1:双循环暴力求解 所有可能结果都算一遍 时间复杂度O(n^2)
思路2:双指针 时间复杂度O(n)

代码:

class Solution {
public:
    //双循环 时间复杂度O(n^2)
    int maxArea_1(vector<int>& height) {
        int max = 0;
        int size = height.size();
        int index_max = size - 1;
        for(int i = 0;i < index_max;i++)
        {
            for(int j = i+1;j < size;j++)
            {
                int temp_max = (j - i) * min(height[i],height[j]);
                if(temp_max > max) 
                {
                    max = temp_max;
                }
            }
        }
        return max;
    }

    //双指针 
    int maxArea(vector<int>& height) {
        int index_left = 0;
        int index_right = height.size() - 1;

        int max_num = 0;

        //左指针+ 右指针-
        while(index_left < index_right)
        {
            int temp_max = min(height[index_right], height[index_left]) * (index_right - index_left);
            if (temp_max > max_num)
            {
                max_num = temp_max;
            }
            if(height[index_right] > height[index_left])
            {
                index_left++;
            } else {
                index_right--;
            }
        }
        return max_num;    
    }
};

leecode. 409. 最长回文串 简单

思路://求字符出现偶数次的次数 使用set集合

代码:

class Solution {
public:
    //求字符出现偶数次的次数 使用set集合
    int longestPalindrome(string s) {
        set<char> ss;
        int size = s.size();
        int count = 0;//成对儿数据的个数
        for(int i = 0;i < size;i++)
        {
            set<char>::iterator it = ss.find(s[i]);
            if(it != ss.end())
            {
                //找到一对儿数据
                ss.erase(s[i]);
                count++;
            }
            else
            {
                ss.insert(s[i]);
            }
        }
        count *= 2;
        if(ss.size() != 0) 
        {
            count++;
        }
        return count;
    }

};

leecode.680 验证回文字符串   简单
描述:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

思路:双指针 + 类似递归的思路代码

代码:

class Solution {
public:
    bool validPalindrome(string s) {
        int i = 0;
        int j = s.length() - 1;
        //双指针
        while(i < j)
        {
            if (s[i] == s[j])
            {
                i++;
                j--;
                continue;
            } else {
                return isValidPalindrome(s,i+1,j) || isValidPalindrome(s,i,j-1); 
            }
        }
        return true;
    }

    bool isValidPalindrome(string s,int left,int right)
    {
        for (int i = left, j = right; i < j; ++i, --j)
        {
            if (s[i] != s[j]) 
            {
                return false;
            }
        }
        return true;
    }
};

这个题最开始我做错了 通过率461/467,错的用例是第一次删除左边也成立删除右边也成立,但是删除左边的话后面就不成立,删除右边的话后面依然成立。没有用另一个函数去判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值