57岛屿数量-61全排列 最长递增路径

news2024/10/5 13:45:40

57岛屿数量

在这里插入图片描述
矩阵中多处聚集着1,要想统计1聚集的堆数而不重复统计,那我们可以考虑每次找到一堆相邻的1,就将其全部改成0,而将所有相邻的1改成0的步骤又可以使用深度优先搜索(dfs):当我们遇到矩阵的某个元素为1时,首先将其置为了0,然后查看与它相邻的上下左右四个方向,如果这四个方向任意相邻元素为1,则进入该元素,进入该元素之后我们发现又回到了刚刚的子问题,又是把这一片相邻区域的1全部置为0,因此可以用递归实现。

终止条件: 进入某个元素修改其值为0后,遍历四个方向发现周围都没有1,那就不用继续递归,返回即可,或者递归到矩阵边界也同样可以结束。
返回值: 每一级的子问题就是把修改后的矩阵返回,因为其是函数引用,也不用管。
本级任务: 对于每一级任务就是将该位置的元素置为0,然后查询与之相邻的四个方向,看看能不能进入子问题。

时间复杂度:O(nm),其中m、n为矩阵的长和宽,需要遍历整个矩阵,每次dfs搜索需要经过每个值为1的元素,但是最坏情况下也只是将整个矩阵变成0,因此相当于最坏遍历矩阵2次
空间复杂度:O(nm),最坏情况下整个矩阵都是1,递归栈深度为mn

import java.util.*;


public class Solution {
    /**
     * 判断岛屿数量
     * @param grid char字符型二维数组 
     * @return int整型
     */
    public int solve (char[][] grid) {
        // write code here
        int m=grid.length;
        if(m==0) return 0;
        int n=grid[0].length;
        if(n==0) return 0;
        int count=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='1'){
                    count++;
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }
    public void dfs(char[][]grid,int i,int j){
    //把所到地方的1全改成0
        grid[i][j]='0';
        //记得判断边界
        if(i>0&&grid[i-1][j]=='1'){
            dfs(grid,i-1,j);
        }
        if(j>0&&grid[i][j-1]=='1'){
            dfs(grid,i,j-1);
        }
        if(i<grid.length-1&&grid[i+1][j]=='1'){
            dfs(grid,i+1,j);
        }
        if(j<grid[0].length-1&&grid[i][j+1]=='1'){
            dfs(grid,i,j+1);
        }
    }
}

58字符串的排列

在这里插入图片描述

一开始就写完了,但是最后一个测试案例一直超时,最后发现是我在dfs中判断contain的方式,本来就是n*n!,contian还要遍历一遍,还要再乘n,复杂度过高。
解决:1.用set,如下代码,全部结束完毕再遍历一遍set,没增加时间复杂度
2. 首先对输入数组排序之后,

 if(i > 0 && str[i - 1] == str[i] && !vis[i - 1])
 //当前的元素str[i]与同一层的前一个元素str[i-1]相同且str[i-1]已经用过了
 continue; 

这种做法时间最少

import java.util.*;
public class Solution {
ArrayList<String> res = new ArrayList<String>();
    StringBuilder list = new StringBuilder();
    HashSet<String> set = new HashSet<String>();
    public ArrayList<String> Permutation(String str) {
        int[] vis = new int[str.length()];//0表示没被访问过
        if(str.length()==0){
            String st = "";
            res.add(st);
            return res;
        }
        dfs(str,vis,0);
        for(Iterator<String> it = set.iterator();it.hasNext();){
            res.add(it.next());
        }
        return res;

    }
public void dfs(String str, int[] vis, int index){
        String s = list.toString();
        if(index==str.length()){
            // if(!res.contains(s)){
            //     res.add(s);//还是复制
            // }
            set.add(s);
           // res.add(s);
            return;
        }  
        for(int i=0;i<str.length();i++){
            if(vis[i]==1) continue;
            vis[i]=1;
            list.append(Character.toString(str.charAt(i)));
            dfs(str,vis,index+1);
            vis[i]=0;
            list.deleteCharAt(list.length()-1);
        }

    }
}

59 N皇后问题

在这里插入图片描述

N皇后是回溯的经典题
看过去的第一反应是用一个n*n的数组存是否访问过,然后在判断是否合法的时候都要遍历这个二维数组,有点麻烦,更简洁一点的是用一个一维数组去存,index表示行,存的值表示列,比如pos[i]=j表示i行j列访问过。

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    int[] pos = new int[9];//index为行,元素值为列
    int count;
    public int Nqueen (int n) {
        // write code here
        Arrays.fill(pos,-1);//初始都为-1
        dfs(n,0);
        return count;
    }
    public void dfs(int n,int index){//第index行
        if(index==n){
            count++;
            return;
        } 
        for(int i=0;i<n;i++){
            if(isValid(index,i)){
                pos[index]=i;
                dfs(n,index+1);
              //  pos[index]=-1; 有没有没关系,因为本来就是一行一个,返回上一个index,这行资源就释放了         
            }         
        }
    }
    public Boolean isValid(int row,int col){
    //遍历已经存过的前面的行
    //注意对角线的写法
        for(int i=0;i<row;i++){
            if(row==i||pos[i]==col||Math.abs(row-i)==Math.abs(pos[i]-col)) return false;
        }
        return true;
    }
}

时间复杂度:O(n∗n!),isValid函数每次检查复杂度为O(n),递归过程相当于对长度为n的数组求全排列,复杂度为O(n!)
空间复杂度:O(n),辅助数组和栈空间最大为O(n)

但是题目要求空间复杂度O(1),题解中没有发现O(1)的做法

输出数组

在这里插入图片描述

import java.util.*;
class Solution {
    int count=0;
    int[] pos = new int[9];
    //注意 new ArrayList<ArrayList<String>>()报错
    List<List<String>> res = new ArrayList<List<String>>();
    public List<List<String>> solveNQueens(int n) {
        Arrays.fill(pos,-1);
        dfs(n,0);
        return (List<List<String>>)res;

    }
    public void dfs(int n,int index){
        if(index==n){
            ArrayList<String> solu = new ArrayList<String>();
            for(int i=0;i<n;i++){
                StringBuilder temp = new StringBuilder();
                for(int j=0;j<n;j++){
                    if(pos[i]==j) temp.append("Q");
                    else temp.append(".");
                }
                solu.add(new String(temp));

            }
            res.add(solu);
            return;
        }
        for(int i=0;i<n;i++){
            if(isValid(index,i)){
                pos[index]=i;
                dfs(n,index+1);
            }
        }
    }
    public Boolean isValid(int row,int col){
        for(int i=0;i<row;i++){
            if(i==row||pos[i]==col||Math.abs(i-row)==Math.abs(pos[i]-col)) return false;
        }
        return true;
    }
}

60 括号生成

在这里插入图片描述
可以先把n转换为((()))字符串,剩下的做法就和之前的没有什么区别,做完之后这样会有一个问题:没有考虑到括号的特性:可能先出现右括号再出现左括号,于是用两个数组来记录左括号和右括号剩余的个数,当两个个数相等的时候,先放入左括号

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @return string字符串ArrayList
     */
    ArrayList<String> res = new ArrayList<String>();
    int[] vis = new int[20];
    public ArrayList<String> generateParenthesis (int n) {
        // write code here
        if(n==0) return res;
        int[] count = new int[2];
        count[0]=n;
        count[1]=n;
        StringBuilder temp = new StringBuilder();
        StringBuilder str = new StringBuilder();
        for(int i=0;i<n;i++){
            str.append("(");
        }
        for(int i=0;i<n;i++){
            str.append(")");
        }
        dfs(str,temp,0,count);
        return res;

    }
    public void dfs(StringBuilder str, StringBuilder temp,int index,int[] count){
        if(index==str.length()){
            res.add(new String(temp));
            return;
        }        
        for(int i=0;i<str.length();i++){ 
            if(vis[i]==1) continue;
            if(i>0&&str.charAt(i)==str.charAt(i-1)&&vis[i-1]==1)  continue;
            if(count[0]==count[1]&&str.charAt(i)==')') continue;
            vis[i]=1;
            if(str.charAt(i)=='(') count[0]--;
            else count[1]--;
            temp.append(Character.toString(str.charAt(i)));
            dfs(str,temp,index+1,count);
            temp.deleteCharAt(temp.length()-1);
            vis[i]=0;
            if(str.charAt(i)=='(') count[0]++;
            else count[1]++;

        }
    }
}

在这里插入图片描述

61 矩阵最长递增路径


在这里插入图片描述
在这里插入图片描述
和岛屿数量差不多。用一个数组存到该位置位置最长的递增个数

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */
     
    public int solve (int[][] matrix) {
        // write code here
        int[][] count=new int[matrix.length][matrix[0].length];
        for (int[] temp: count){
        //注意fill只能填充一维数组
            Arrays.fill(temp, 1);
        }
        for(int i=0;i<count.length;i++){
            for(int j=0;j<count[0].length;j++){
                dfs(matrix,i,j,count);
            }
        }  
        int max = Integer.MIN_VALUE;
        for(int i=0;i<count.length;i++){
            for(int j=0;j<count[0].length;j++){
                if(count[i][j]>max) max = count[i][j];
            }
        }
        return max;
    }
    public void dfs(int[][] matrix, int i,int j,int[][] count){
        if(i>0&&matrix[i-1][j]>matrix[i][j]){
            count[i-1][j] = Math.max(count[i][j]+1,count[i-1][j]);
            dfs(matrix,i-1,j,count);
        }
        if(j>0&&matrix[i][j-1]>matrix[i][j]){
            count[i][j-1] = Math.max(count[i][j]+1,count[i][j-1]);
            dfs(matrix,i,j-1,count);
        }
        if(i<matrix.length-1&&matrix[i+1][j]>matrix[i][j]){
            count[i+1][j] = Math.max(count[i][j]+1,count[i+1][j]);
            dfs(matrix,i+1,j,count);
        }
        if(j<matrix[0].length-1&&matrix[i][j+1]>matrix[i][j]){
            count[i][j+1] = Math.max(count[i][j]+1,count[i][j+1]);
            dfs(matrix,i,j+1,count);
        }
    }
}

时间复杂度:O(mn),m、n分别为矩阵的两边,遍历整个矩阵以每个点作为起点,然后递归相当于遍历填充dp矩阵
空间复杂度:O(mn),辅助矩阵的空间是一个二维数组

二维数组填充

int[][] count=new int[matrix.length][matrix[0].length];
for (int[] temp: count){
    Arrays.fill(temp, 1);//给一维的每个元素填充1
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AtCoder Beginner Contest 283 (A~F)

比赛名称&#xff1a;UNIQUE VISION Programming Contest 2022 Winter(AtCoder Beginner Contest 283) 比赛链接&#xff1a;AtCoder Beginner Contest 283 A - Power 题意&#xff1a; 求A^B(1<A,B<9) 要注意这个int强制转换&#xff0c;不然9^9输出结果时387420489&…

python根据json数据画疫情分布地图

目录 一.基础地图使用 1.掌握使用pyecharts构建基础的全国地图可视化图表 二.疫情地图——国内疫情地图 1.案例效果 代码 三.疫情地图——省级疫情地图 四.数据集 注&#xff1a;数据集在文章最后 一.基础地图使用 1.掌握使用pyecharts构建基础的全国地图可视化图表 演…

Learning to Segment Every Thing

摘要 现有的目标实例分割方法要求所有训练样本都具有分割mask标注。然而&#xff0c;标注新的类别是非常费劲的&#xff0c;因此这将实例分割模型的应用范围限制在100个左右的有标注的类。本文的目的是提出一种新的部分监督的训练模型&#xff0c;以及一种新的权重传递函数&am…

洛谷【算法1-7】搜索刷题——优化、错题

文章目录[USACO1.5]八皇后 Checker Challenge题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路搜索框架代码位运算优化lowbit运算思路kkksc03考前临时抱佛脚题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码吃奶酪题目描述输入格式输…

C++ STL 之可变长数组 Vector 详解

文章目录Part.I AttentionChap.I 注意事项Chap.II 操作技巧Part.II FunctionChap.I 构造函数Chap.II 增加函数Chap.III 删除函数Chap.IV 遍历函数Chap.V 判断/大小/其他函数Part.III CodePart.I Attention Chap.I 注意事项 使用vector需要注意的地方&#xff1a; 加引用#inc…

分布式与微服务系列 - SpringBoot + Zookeeper集群 + Dubbo分布式托管(提供者、消费者)+ Nginx反向代理

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 再搭建集群项目前&#xff0c;请先学习相关技术的知识&#xff1a; 分布式与微服务系列 - Dubbo分布式与微服务系列 - Zookeeper上篇&#xff1a;入门到精通参考文档&#xff1a;分布式与微服务…

状态机——奇葩的状态表示

状态机——奇葩的状态表示 简述 在动态规划中&#xff0c;遇到有一个点有多个状态&#xff0c;混在一起无法表示&#xff0c;那么就可以把状态分开&#xff0c;并且构造出不同状态之间的转移关系&#xff0c;然后再求出状态转移方程&#xff0c;之后就OK了。 题目 1049. 大…

GNN algorithms(3): Tri-party Deep Network Representation

目录 Tri-party Deep Network Representation Essence Thinking Abstract Introduction Problem Definition Tri-DNR pipelines Model Architecture Tri-party Deep Network Representation Essence 1) Deepwalk提取graph structure信息&#xff0c;即structural nod…

MyBatis 一文基础总结

MyBatis 一文基础总结老师的随堂上课笔记&#xff0c; 供参考~1.框架概述1.1 软件开发常用结构1.1.1三层架构三层的处理请求的交互&#xff1a;用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库1.1.2 常用框架常见的 J2EE 中开发框架&#xff1a;MyBatis…

adworld-web-inget-20221226

inget 题目来源: 宜兴网信办 题目描述: 无 题目场景: http://61.147.171.105:51222 http://61.147.171.105:51222/?id1%27%20%20or%2011%20– Please enter ID,and Try to bypass nice : congratulations Flag Is : cyberpeace{3df1eecfb5f794d6a94eba429f7e2846} ┌…

【NI Multisim 14.0编辑环境——菜单栏】

目录 序言 一、菜单栏 &#x1f349;1.文件 &#x1f349;2.编辑 &#x1f349;3.视图 &#x1f349; 4.绘制 &#x1f349;5.MCU&#xff08;微控制器&#xff09;菜单 &#x1f349; 6.仿真 &#x1f349; 7.转移 &#x1f349; 8.工具 &#x1f349; 9.报告 &…

录屏有声音吗?电脑如何录屏有声音?图文教程来了!

无论是学习、办公还是娱乐&#xff0c;都需要屏幕录制。许多人在录制视频后发现视频没有发出声音。录屏有声音吗&#xff1f;电脑如何录屏有声音&#xff1f;一个相对简单的方法是在使用电脑的屏幕录制功能时检查是否打开录制屏幕的声音。此外&#xff0c;如果您担心每次都需要…

这应该是全网最全的MySQL数据库的常用命令了吧

目录 前言 数据库的创建 数据表的操作 表数据的增删查改 分组与函数查询 分组与函数查询 运算符&#xff1a;数学运算符 连接查询 前言 今天给大家点来MySQL数据库的常用命令总结&#xff0c;这应该是全网最详细&#xff0c;最实用的数据库命令总结了&#xff0c;因为命…

addr2line

1、符号表 1.1什么是符号表 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示&#xff1a; <起始地址> <结束地址> <函数> [<文件名:行号>] 1.2为什么要配置符号表 为了能快速并准确地定位引擎发生Crash的代码位置 举个例子…

【UE4 第一人称射击游戏】16-重新装弹

上一篇&#xff1a; 【UE4 第一人称射击游戏】15-修复蹲伏和冲刺同时执行的bug 本章效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加两个整数类型变量&#xff0c;分别命名为“MaxAmmo”和“ClipSize”&#xff0c;表示最大载弹量和每次重新装弹的…

MATLAB多项式符号运算

符号计算是指在运算时&#xff0c;无须事先对变量进行赋值&#xff0c;而是将所有得到的结果以标准的符 号形式表示出来。符号计算是以符号对象和符号表达式作为运算对象的表达形式&#xff0c;最终给出 的是解析解;在运算过程中不会受到计算误差累积问题的影响&#xff0c;其计…

信息安全编码标准:使用SAST实施安全编码实践

信息安全编码标准:使用SAST实施安全编码实践 当开发团队使用信息安全编码标准来开发软件时&#xff0c;通常希望更少的安全Bug和更好的代码质量&#xff0c;从而给用户带来健壮性更好的产品。在本篇文章中&#xff0c;我们将介绍信息安全编码标准的基础知识、最佳实践、如何以…

【swaggo】swaggo使用详解

一、swagger简介 swagger是一套基于OpenAPI规范构建的开源工具&#xff0c;使用RestApi。swagger-ui 呈现出来的是一份可交互式的API文档&#xff0c;可以直接在文档页面尝试API的调用。     gin-swagger 是基于注释生成 API 文档&#xff0c;项目地址:https://github.com/…

vulfocus复现:log4j2-rce-2021-12-09

文章目录一、漏洞影响二、复现过程一、漏洞影响 Apache Log4j 是一个基于Java的日志记录工具。经过多年的开发迭代&#xff0c;Log4j 1.x的维护已经变得非常困难&#xff0c;因为它需要与非常旧的 Java 版本兼容&#xff0c;所以于 2015 年 8 月正式升级为Log4j2。黑客可以恶意…

【C++】堆与二叉树(非常详细,附带堆排哦)

之前学习了很多的数据结构 有顺序表&#xff0c;堆&#xff0c;栈... 今天学习一种新的逻辑结构二叉树&#xff0c;他的物理结构是堆 让我们先简单回顾一下堆吧堆的简单介绍和一些简单功能的实现 1. 二叉树 其实堆就是一种特殊的数组&#xff0c;他的逻辑结构是二叉树 &#…