当前位置: 首页 > news >正文

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

 

http://www.dtcms.com/a/610763.html

相关文章:

  • flutter实践:DropdownButton2使用示例
  • 电商网站订烟平台官网wordpress dux1.4
  • 【信创】软硬件概览
  • 论述网站建设过程中应注意的问题电脑和手机都能浏览的网站开发
  • 扬州市住房和城乡建设网站学科分类目录
  • springboot、Mybatis-plus工程多数据源字段映射不生效
  • 大模型应用开发5-SpringAIalibaba实战
  • 网站子站怎么做的外贸网站建设的好处
  • Go语言包管理/模块管理
  • 写出电子商务网站的建设流程wordpress配置文件是
  • Design Compiler:在GUI界面查询设计对象的属性
  • 海洋网站建设网络章丘做网站
  • (三)分支与合并 - git cherry-pick 命令的使用
  • 开发者实践:AGV 梯控的边缘计算私有部署与数据不出厂解耦
  • 网站备案法律法规网站建设有免费的空间吗
  • Java后端实战:Nginx集群适配免费WAF,解决API高频请求与参数校验痛点
  • 桌面开发,在线%日记本,日历%系统开发,基于eclipse,jdk,java,无数据库
  • 建设档案员证书查询网站电子政务门户网站建设代码
  • 企业集团网站建设python创建网站
  • MR30分布式IO、MBox20边缘计算网关系列产品在航空航天项目的应用
  • 网站开发英文微信连接微网站
  • 复杂系统中的机器学习瓦解与解体早期预警信号
  • LeetCode 加油站
  • C语言在线编译 | 提升学习效率,随时随地进行编程实验
  • 前端高频面试题之Vuex篇
  • 大石桥做网站网站开发是什么部门
  • 职业本科发展路径与规划指南
  • 同一局域网下,外面无法访问本机Java服务(Windows)
  • 网站上的漂浮广告做行程好的网站
  • 生态环评全流程实战:从指数计算到专题制图- 基于最新导则,集成Rstudio、Fragstats、ENVI、Maxent于陆域水域项目案例