【C++笔试强训】如何成为算法糕手Day7


 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台  

 循环渐进Forward-CSDN博客


目录

 循环渐进Forward-CSDN博客

字符串中找出连续最长的数字串

思路:

岛屿数量

思路:

深度优先遍历DFS

广度优先遍历 BFS

并查集

拼三角

思路:

字符串中找出连续最长的数字串

牛客网做题链接:字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com)

思路:

        模拟+双指针。

        当j指针和i指针之间长度len大于之前的值时更新len

#include <iostream>
using namespace std;
#include<string>
int main() {
  string str;

  cin>>str;
  int begin=-1,len=0;

  for(int i=0;i<str.size();i++)
  {
    int j=i;
    while(j<str.size() && str[j]>='0' && str[j]<='9')j++;
    if(j-i>len)
    {
        begin=i;
        len=j-i;
    }
    i=j;
  }
  cout<<str.substr(begin,len)<<endl;
  
}

岛屿数量

leetcode网做题链接:200. 岛屿数量 - 力扣(LeetCode)

思路:

深度优先遍历DFS

目标是找到矩阵中 “岛屿的数量” ,上下左右相连的 1 都被认为是连续岛屿。

dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。

  • 从 (i, j) 向此点的上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 做深度搜索。
  • 终止条件:
    • (i, j) 越过矩阵边界;
    • grid[i][j] == 0,代表此分支已越过岛屿边界。
  • 搜索岛屿的同时,执行 grid[i][j] = ‘0’,即将岛屿所有节点删除,以免之后重复搜索相同岛屿。
  • 主循环:
    • 遍历整个矩阵,当遇到 grid[i][j] == ‘1’ 时,从此点开始做深度优先搜索 dfs,岛屿数 count + 1 且在深度优先搜索中删除此岛屿。
  • 复杂度:所有的数遍历一遍,所以复杂度是O(N*M)
class Solution {
public:
    void dfs(vector<vector<char>>& grid, int i, int j)
    {
        // 当前部分走过了,因此把当前部分置为0
        grid[i][j] = '0';
        // 依次看看上下左右是不是还有同属岛屿的其他部分
        // 若有,则依次遍历并置为0
        if (i > 0 && grid[i-1][j] == '1')
            dfs(grid, i-1, j);
        if (i < grid.size()-1 && grid[i+1][j] == '1')
            dfs(grid, i+1, j);
        if (j > 0 && grid[i][j-1] == '1')
            dfs(grid, i, j-1);
        if (j < grid[0].size()-1 && grid[i][j+1] == '1')
            dfs(grid, i, j+1);
    }
 
    int numIslands(vector<vector<char>>& grid) {
        // 分别记录行、列以及岛屿总数
        int row = grid.size();
        int col = grid[0].size();
        int cnt = 0;
        // 从第一行第一列开始,寻找有没有是'1'的位置,若有,则登岛遍历,岛屿数加1
        for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                if (grid[i][j] == '1')
                {
                    dfs(grid, i, j);
                    ++cnt;
                }
            }
        }
        // 返回岛屿的总数
        return cnt;
    }
};

广度优先遍历 BFS

  • 主循环和思路一类似,不同点是在于搜索某岛屿边界的方法不同。
  • bfs 方法:
    • 借助一个队列queue,判断队列首部节点(i, j)是否未越界而且为1
      • 如果是则置(删除此岛屿),并将此节点上下左右节点(i+1,j),(i-1,j),(i,j+1),(i,j-1)加入队列
      • 如果不是则跳过此节点
    • 循环pop队列首节点,直到整个队列为空,此时已经遍历完此岛屿
class Solution {
public:
 
    int numIslands(vector<vector<char>>& grid) {
        int row = grid.size();
        int col = grid[0].size();
        int cnt = 0;
 
        for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                // 只要找到了一个为'1'的,那么登岛
                if (grid[i][j] == '1')
                {
                    // 当前找到的新岛屿,数量加1
                    ++cnt;
                    // 广度优先,那么需要借助队列来实现
                    queue<pair<int, int>> bfs_q;
                    // 把当前走过的地方置0
                    grid[i][j] = 0;
                    bfs_q.push({i, j});
                    // 只要队不空就循环
                    while (!bfs_q.empty())
                    {
                        // 取出队头元素,出队
                        auto cur = bfs_q.front();
                        bfs_q.pop();
                        // 判断队头元素的上下左右是否有岛屿的其他部分,有的话则入队并置0
                        if (cur.first > 0 && grid[cur.first-1][cur.second] == '1')
                        {
                            bfs_q.push({cur.first-1, cur.second});
                            grid[cur.first-1][cur.second] = 0;
                        }
                        if (cur.first < row-1 && grid[cur.first+1][cur.second] == '1')
                        {
                            bfs_q.push({cur.first+1, cur.second});
                            grid[cur.first+1][cur.second] = 0;
                        }
                        if (cur.second > 0 && grid[cur.first][cur.second-1] == '1')
                        {
                            bfs_q.push({cur.first, cur.second-1});
                            grid[cur.first][cur.second-1] = 0;
                        }
                        if (cur.second < col-1 && grid[cur.first][cur.second+1] == '1')
                        {
                            bfs_q.push({cur.first, cur.second+1});
                            grid[cur.first][cur.second+1] = 0;
                        }
                    }
                }
            }
        }
        return cnt;
    }
};

并查集

        是一种树型的数据结构,用于处理一些不相交的合并以及查询问题。

步骤:

  • 遍历这个二维数组,将所有的1都认为是一个单独的集合
  • 遍历这个二维数组,对于每一个1,只看它的左边和上边,如果发现有1,就做union操作(为甚只看左边和上边,因为右边和下边是对称的,而我们从左到右,从上到下遍历,所以不会重复和遗落)
class Solution {
public:
    int find(int idx)
    {
        // 若当前节点的父节点就是自己,那么只需要返回自己
        if (parent[idx] == idx) 
            return idx;
        // 路径压缩,只要idx节点的父节点不是整个集合的头节点,那么就把路径上每个节点都向集合的头结点
        parent[idx] = find(parent[idx]);
        // 返回idx的父节点(也是整个集合的头节点)
        return parent[idx];
    }
 
    void union_n (int idx_1, int idx_2)
    {
        int par_1 = find(idx_1);
        int par_2 = find(idx_2);
        // 若idx_1和idx_2的父节点是同一个,那就不做任何操作
        if (par_1 == par_2) 
            return;
        // 原本par_1和par_2分别是idx_1和idx_2的父节点,因此都指向自己
        // 这个赋值将par_1的父节点指向了par_2,完成了合并操作
        parent[par_1] = par_2;
        // 每当一块陆地拼进了岛屿,那么陆地数量自减
        --land_num;
    }
 
    int numIslands(vector<vector<char>>& grid) {
        // 输入的行与列
        int row = grid.size();
        int col = grid[0].size();
        // 初始化陆地数量以及数组
        land_num = 0;
        parent = vector<int> (row*col, -1);
        // 构建并查集
        for (int i = 0; i < row; ++i)
            for (int j = 0; j < col; ++j)
            {
                if (grid[i][j] == '1')
                    ++land_num;
                // 初始化父亲节点都为自己
                parent[i*col + j] = i*col + j;
            }
        // 进行并查的过程
        for (int i = 0; i < row; ++i)
            for (int j = 0; j <col; ++j)
            {
                if (grid[i][j] == '1')
                {
                    // 从左往右逐行遍历,若下方或者右方的节点也是陆地,那么就拼在一起
                    if (i + 1 < row && grid[i+1][j] == '1')
                        union_n(i*col+j, (i+1)*col+j);
                    if (j + 1 < col && grid[i][j+1] == '1')
                        union_n(i*col+j, i*col+j+1);
                }
            }  
        // 返回剩下的陆地数量(岛屿数量)
        return land_num;
    }
private:
    // 记录父节点以及陆地的数量
    vector<int> parent;
    int land_num;
};


拼三角

牛客网做题链接:A-拼三角_牛客小白月赛32 (nowcoder.com)

思路:

        这道题所需要的,其实就是利用贪心算法,找出这条规律:能组成三角形的三条边中,两条最短边之和一定大于第三边。注意,是最短边,如果是任意两条边,那样会加大我们的工作量的。

但贪心的点就在于,要是连两条最短边相加,都大于第三边了,那其他任意两边之和,一定也会大于第三边的。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    vector<int> arr(6);
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[0] >> arr[1] >> arr[2] >> arr[3] >> arr[4] >> arr[5];
        sort(arr.begin(), arr.end());
        if((arr[0] + arr[1] > arr[2] && arr[3] + arr[4] > arr[5]) ||
           (arr[0] + arr[2] > arr[3] && arr[1] + arr[4] > arr[5]) ||
           (arr[0] + arr[3] > arr[4] && arr[1] + arr[2] > arr[5]) ||
           (arr[0] + arr[4] > arr[5] && arr[1] + arr[2] > arr[3]))
        {
            cout << "Yes" << endl;
        }
        else
        {
            cout << "No" << endl;
        }
    }
    return 0;
}

 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学成在线——关于nacos配置优先级的坑

出错&#xff1a; 本地要起两个微服务&#xff0c;一个是content-api&#xff0c;另一个是gateway网关服务。 发现通过网关服务请求content微服务时&#xff0c;怎么请求都请求不到。 配置如下&#xff1a; content-api-dev.yaml的配置&#xff1a; server:servlet:context-p…

【华为】配置BGP协议

边界网关协议BGP是一种实现自治系统AS之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。BGP在不同自治系统之间进行路由转发&#xff0c;分为EBGP&#xff08;外部边界网关协议&#xff09;和IBGP&#xff08;内部边界网关协议&#xff09;两种情况。 [A]in g0/0/…

HTML(七)表格

在HTML中&#xff0c;表格的标准形式如下&#xff1a; <table></table> 使用上面的语言&#xff0c;就已经生成了一个表格&#xff0c;只不过这个表格什么都没有 那么&#xff0c;该如何让表格存在东西呢&#xff1f; 首先&#xff0c;我们需要使用到<tr> …

C++ 匿名对象(没有名字的对象,类似于临时对象)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 用类型(实参)定义出来的对象叫做匿名对象&#xff0c;相比之前我们定义的类型…

【Windows】【DevOps】Windows Server 2022 安装ansible,基于powershell实现远程自动化运维部署 入门到放弃!

目标服务器安装openssh server参考 【Windows】【DevOps】Windows Server 2022 在线/离线 安装openssh实现ssh远程登陆powershell、scp文件拷贝-CSDN博客 注意&#xff1a;Ansible不支持Windows操作系统部署 根据官方说明&#xff1a; Windows Frequently Asked Questions —…

如何使用IntelliJ IDEA生成UML图

&#x1f3dd;️ 博主介绍 大家好&#xff0c;我是一个搬砖的农民工&#xff0c;很高兴认识大家 &#x1f60a; ~ &#x1f468;‍&#x1f393; 个人介绍&#xff1a;本人是一名后端Java开发工程师&#xff0c;坐标北京 ~ &#x1f389; 感谢关注 &#x1f4d6; 一起学习 &…

WPF 为button动态设置不同的模板

有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容&#xff0c;比如Button未点击安装显示&#xff1a; 安装后显示&#xff1a; 可以通过设置button的content&#xff0c;通过content来设置不同的模板来实现功能&#xff0c;以下是代码&#xff1a; MainWi…

QD1-P5 HTML 段落标签(p)换行标签(br)

本节视频 www.bilibili.com/video/BV1n64y1U7oj?p5 ‍ 本节学习 HTML 标签&#xff1a; p标签 段落br标签 换行 ‍ 一、p 标签-段落 1.1 使用 p 标签划分段落 <p>段落文本</p>示例 <!DOCTYPE html> <html><head><meta charset"…

79 NAT-NAT444端口块静态映射

NAT444&#xff08;Network Address Translation 444&#xff09;是一种网络地址转换技术&#xff0c;用于将私有IP地址转换为公有IP地址&#xff0c;实现私有网络与公有网络之间的通信。 端口块静态映射是NAT444中的一种映射方式&#xff0c;它将一组端口范围映射到一个公有I…

【D3.js in Action 3 精译_034】4.1 D3 中的坐标轴的创建(中一)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

Node.js概述

1. Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。 地址&#xff1a;Node.js 中文网 1.1 Node.js中的JavaScript运行环境 &#xff08;1&#xff09;浏览器是JavaScript的前端运行环境 &#xff08;2&#xff09;Node.js是JavaScript的后端运行环境 …

2.使用 Label Studio 标注文本

使用 Label Studio 标注文本 文章目录 使用 Label Studio 标注文本前言Label Studio的简单使用1.创建项目2.添加本地存储3.选择标注模板4.添加数据5.标注6.添加关系 总结 前言 Label Studio是一个开源的功能强大的标注平台&#xff0c;可以标注视频&#xff0c;图片&#xff0…

Ubuntu终端配置

选择shell shell有很多&#xff0c;默认的是bash&#xff0c;一般就够用里&#xff0c;想要花里胡哨点就用zsh&#xff0c;还有最近比较火的fish 如果在刚开始安装完Ubuntu没有改shell&#xff0c;后面就不要改了。 安装的软件会设置环境变量&#xff0c;这些环境变量都是写入…

RocketMq详解:三、RocketMq通用生产和消费方法改造

文章目录 1.背景2.通用方法改造2.1添加maven依赖2.2 RocketMq基础配置2.3 配置类2.5 消息传输的对象和结果2.4 消息生产者2.5 消息消费者2.6 功能测试 1.背景 在第二章&#xff1a;《RocketMq详解&#xff1a;二、SpringBoot集成RocketMq》中我们已经实现了消费基本生产和消费…

动态规划-多状态问题——740.删除获得点数

1.题目解析 题目来源&#xff1a;740.删除并获得点数——力扣 测试用例 2.算法原理 首先将原数组根据每个数映射为下标&#xff0c;相加后存储在以该数本身为下标的新数组中 1.状态表示 这里与路径问题不同的是每个位置都不止一个状态&#xff0c;因此开辟两个dp表&#xff0…

Unity URP shader ———魔系符文宝石是如何练成的

各位同学大家好 我已经很久没有没有写教程了&#xff0c;最近项目比较忙。各种加班各种带小孩儿&#xff0c;不过&#xff0c;老师一有机会也在给尽可能服务大家&#xff0c;今天来一个硬菜&#xff1a;移动端高效魔系符文如何制作&#xff0c;国庆起来&#xff0c;老师抽了点…

六西格玛设计DFSS方法论在消费级无人机设计中的应用——张驰咨询

本文基于六西格玛设计方法论&#xff0c;对消费级无人机的设计流程进行系统化研究&#xff0c;探讨如何通过六西格玛设计的理念、工具和方法提升无人机产品的设计质量和市场竞争力。文章从市场定位、客户需求分析出发&#xff0c;深入到关键KPI指标的制定&#xff0c;并逐步阐述…

vulnhub-Web Developer 1靶机

vulnhub&#xff1a;Web Developer: 1 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.114.129&#xff0c;扫描端口 有网站服务&#xff0c;访问 没什么东西&#xff0c;扫目录 真不少&#xff0c;访问一下&#xff0c;也只是一些普通的Wordpr…

滑雪——记忆化搜索

题目 代码 //#pragma GCC optimize(3)#include <bits/stdc.h> const int N 310; using namespace std; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int ans; int g[N][N]; int r, c; int f[N][N]; int dfs(int x, int y) {if(~f[x][y]) return f[x][y];f[x][y] …