1.最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
思路:动态规划
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();//字符串数组
vector<vector<int>> dp(n, vector<int>(n));
string ans;
for (int l = 0; l < n; ++l) {
for (int i = 0; i + l < n; ++i) {
int j = i + l;
if (l == 0) {
dp[i][j] = 1;//一个字符的情况
}
else if (l == 1) {
dp[i][j] = (s[i] == s[j]);//两个字符的情况
}
else {
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);//状态转移方程
}
if (dp[i][j] && l + 1 > ans.size()) {
ans = s.substr(i, l + 1);//更新最大长度
}
}
}
return ans;
}
};2.二叉搜索树的第k个节点
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot==nullptr||k==0) return nullptr;
return KthNodeCore(pRoot,k);
}
TreeNode* KthNodeCore(TreeNode* pRoot,int &k)
{
TreeNode* target=nullptr;
//中序遍历
if(pRoot->left)
{
target=KthNodeCore(pRoot->left,k);//先遍历左子树
}
if(target==nullptr)//左子树中没找到
{
if(k==1)
target=pRoot;//遍历完左子树,k=1,就返回根节点
k--;//否则K--,开始遍历右子树
}
if(target==nullptr&&pRoot->right!=nullptr)//再遍历右子树
{
target=KthNodeCore(pRoot->right,k);
}
return target;
}
};3.数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
class Solution {
public:
vector<int> res;
void Insert(int num)
{
res.push_back(num);
}
double GetMedian()
{
sort(res.begin(),res.end());
int len=res.size();
if(len%2==1)
return (double)res[len/2];
else
return (double)((res[len/2]+res[len/2-1])/2.0);
}
};4.滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> maxInWindows;
if(num.size()>=size&&size>=1)
{
deque<int> index;
for(unsigned int i=0;i<size;i++)//放入一个滑动窗口,令队头是窗口的最大值
{
while(!index.empty()&&num[i]>=num[index.back()])
{
index.pop_back();//要放入的数大于队尾,就把队尾弹出
}
index.push_back(i);//放入新数字
}
for(unsigned int i=size;i<num.size();i++)
{
maxInWindows.push_back(num[index.front()]);//存一个最大值
while(!index.empty()&&num[i]>=num[index.back()])
index.pop_back();//要放入的数大于队尾,就把队尾弹出
if(!index.empty()&&index.front()<=(int)(i-size))
index.pop_front();//队头大于滑动窗口范围,就弹出
index.push_back(i);//放入新数字
}
maxInWindows.push_back(num[index.front()]);
}
return maxInWindows;
}
};
京公网安备 11010502036488号