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;
}
};
思路://求字符出现偶数次的次数 使用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,错的用例是第一次删除左边也成立删除右边也成立,但是删除左边的话后面就不成立,删除右边的话后面依然成立。没有用另一个函数去判断。