dfs|bfs|定长栈|栈+双指针

lc1574

用栈可以维护单增序列,但是怎么样去找这个删除的最短子序列呢

  • 找最长前缀非递减序列、最长后缀非递减序列
  • 再用双指针找二者最优拼接点(因为想最小可能的删除,所以存在双指针的单调性)

class Solution {

public:

int findLengthOfShortestSubarray(vector<int>& arr) {

int n = arr.size();

if (n <= 1) return 0;

// 步骤1:找最长前缀非递减序列的结束位置left

int left = 0;

while (left + 1 < n && arr[left] <= arr[left + 1]) {

left++;

}

if (left == n - 1) return 0; // 整个数组已非递减

// 步骤2:找最长后缀非递减序列的起始位置right

int right = n - 1;

while (right - 1 >= 0 && arr[right - 1] <= arr[right]) {

right--;

}

// 步骤3:初始候选答案(只保留前缀或只保留后缀的情况)

int ret = min(n - left - 1, right);

// 步骤4:双指针找前缀和后缀的最优拼接点

int i = 0, j = right;

while (i <= left && j < n) {

++if (arr[i] <= arr[j]) {
// 可以拼接,更新答案
ret = min(ret, j - i - 1);
++

i++;

} ++else
j++;
++

}

return ret;

}

};

lc1673

定长栈

+剩余数的条件三判断 保障了k长

while (!st.empty() && x < st.back() && st.size() + nums.size() - i > k) st.pop_back();

class Solution {

public:

vector<int> mostCompetitive(vector<int>& nums, int k) {

vector<int> st;

for (int i = 0; i < nums.size(); i++) {

int x = nums[i];

while (!st.empty() && x < st.back() && ++st.size() + nums.size() - i > k) {
st.pop_back();
++

}

++if (st.size() < k)
st.push_back(x);
++

}

return st;

}

};

lc865

(DFS)计算节点深度

若左右子树深度相同,当前节点即为最深叶子的最近公共祖先(LCA);

否则取深度更深的子树的LCA

pair<TreeNode*,int> dfs(TreeNode* root,int depth)

亮点:pair dfs

出口!

auto left记录下一层拿到的结果,再去进行return if-else比较,确定return what

class Solution {

public:

TreeNode* subtreeWithAllDeepest(TreeNode* root){

return dfs(root,0).first;

}

//还和深度有关 维护一个pair

pair<TreeNode*,int> dfs(TreeNode* root,int depth)

{

//出口 空节点

if(!root)

return {nullptr,depth-1};

auto left=dfs(root->left,depth+1);

//1 catch return left

auto right=dfs(root->right,depth+1);

//返回控制

if(!root->left && !root->right)

return {root,depth};

// 比较左右子树深度

++if(left.second == right.second)++

++return {root, left.second};++

++//++2 battle = return root,dep

else if(left.second > right.second)

return left;

//3 !=已完成 继承return longer

else

return right;

}

};

lcr44

class Solution {

public:

vector<int> largestValues(TreeNode* root)

{

if(!root) return {};

vector<int> ret;

queue<TreeNode*> q;

q.push(root);

while(q.size())

{

int sz=q.size();

int mx=INT_MIN;

while(sz--)

{

auto t=q.front();

q.pop();

mx=max(mx,t->val);

if(t->left)

q.push(t->left);

if(t->right)

q.push(t->right);

}

ret.push_back(mx);

}

return ret;

}

};

相关推荐
t19875128几秒前
基于MATLAB的线性判别分析(LDA)降维算法实现方案
开发语言·算法·matlab
仰泳的熊猫10 分钟前
1108 Finding Average
数据结构·c++·算法·pat考试
老赵聊算法、大模型备案16 分钟前
2025 年 12 月北京市生成式人工智能服务备案分析:政务场景再扩容,合规生态更聚焦
人工智能·算法·microsoft·aigc·政务
liuyao_xianhui17 分钟前
山脉数组的峰顶索引_优选算法_二分查找法
算法
炽烈小老头21 分钟前
【每天学习一点算法 2025/12/15】环形链表
学习·算法·链表
点云SLAM23 分钟前
算法复杂度分析之——空间复杂度分析和标准库算法与容器操作的复杂度实际案例分析(3)
算法·深度优先·空间复杂度·算法性能分析·标准库算法
Liangwei Lin25 分钟前
洛谷 P5788 【模板】单调栈
算法
京东零售技术26 分钟前
ACL 2025 | 一种用于电子商务query意图分类的半监督可扩展统一框架
算法
ytttr8731 小时前
matlab实现多标签K近邻(ML-KNN)算法
算法·机器学习·matlab
一招定胜负1 小时前
逻辑回归调优三板斧:参数调整、阈值设定、数据集平衡
算法·机器学习·逻辑回归