leetcode刷题记录

岛屿类问题

问题1:岛屿数量

思路:用DFS的方法,遍历数组中的每一个点,遇到是岛屿的岛屿数量增加,从当前这个节点开始进行深度遍历,把这个节点变成非岛形式,继续再对周围四个点调用DFS。所以应该在DFS函数上加上判断当

if(posi<0 || posj<0 || posi>=row || posj>=col){
    return;
}

同时还应该考虑到如果当前遍历到的这个位置是非岛的时候,就不再进行搜索了,直接返回,因此

if(posi<0 || posj<0 || posi>=row || posj>=col || grid[posi][posj] == '0'){
    return;
}

最终代码如下

class Solution {
    public int numIslands(char[][] grid) {
        //dfs
        int cnt=0;
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[0].length;j++){
                if(grid[i][j] == '1'){
                    cnt++;
                    dfs(grid,i,j);
                }
            }
        }
        return cnt;
    }
    private void dfs(char[][] grid, int r,int c){
        if(r>=grid.length || c>=grid[0].length || r<0 || c<0 || grid[r][c] == '0'){
            return ;
        }
        grid[r][c]='0';
        dfs(grid,r-1,c);
        dfs(grid,r+1,c);
        dfs(grid,r,c-1);
        dfs(grid,r,c+1);

    }
}

科大讯飞2022.08.20笔试题第三题

迷宫找礼物,求找到礼物的最短路径。
给定一个4x4的二维数组,0代表能走,1代表不能走,8代表宝藏的位置,入口是二维数组的边界位置的任一个不为0的位置,求从人口到宝藏位置的最短路径,并输出路径。

输入:[[0,1,1,1], [0,0,0,1], [1,0,8,1], [1,0,1,1]]

输出:(3,1),(2,1),(2,2)

思路:比较常规的DFS

public class Main {
    static String ans;
    static int anslen=Integer.MAX_VALUE;
    public static void main(String[] args) {
        //test();
        int[][] G=new int[][]{
                {0,1,1,1},
                {0,0,0,1},
                {1,0,8,1},
                {1,0,1,1}};
        test(G);

        System.out.println(ans);
    }

    public static void test(int[][] G){
        int[][] visited=new int[4][4];
       for(int i=0;i<4;i++){
           if(G[i][0]==0){
               dfs(G,i,0,new String(),visited);
           }
           if(G[i][3]==0){
               dfs(G,i,3,new String(),visited);
               System.out.println("yes !");
           }
           if(G[0][i]==0){
               dfs(G,0,i,new String(),visited);
               //System.out.println("yes111");
           }
           if(G[3][i]==0){
               dfs(G,3,i,new String(),visited);
               //System.out.println("yes222");
           }
       }
    }


    public static void dfs(int[][] G, int idxRow, int idxCol, String li, int[][] visited){
        if(visited[idxRow][idxCol]==0){
            visited[idxRow][idxCol]=1;
        }else{
            return;
        }
        //System.out.println(li);
        int[][] arr=new int[][]{{-1,0},{1,0},{0,-1},{0,1}};

        if(li.length()==0){
            li=li+"("+idxRow+","+idxCol+")";
        }else{
            li=li+",("+idxRow+","+idxCol+")";
        }

        for(int i=0;i<4;i++){
            int X=idxRow+arr[i][0];
            int Y=idxCol+arr[i][1];
            //System.out.println("x="+X+ " Y="+Y);
            if(X>=0  && X<4 && Y>=0 && Y<4){
                if(G[X][Y]==8){
                    //System.out.println(G[X][Y]);
                    li=li+",("+X+","+Y+")";
                    if(li.length()<anslen){
                        ans=li;
                        anslen=li.length();
                    }
                }else{
                    if(G[X][Y] == 0){
                        dfs(G,X,Y,li,visited);
                    }
                }
            }
        }
        visited[idxRow][idxCol]=0;
    }

}

重写比较器

问题1:179. 最大数

思路:对于数组中元素,首先转化为String类型,然后对String类型数组再排序,重写排序算法。排序的标准就是,两个字符串,a和b,判断是ab比较大还是ba比较大,哪个比较大那个就算大的。排序之后再拼接,最后对于形成的字符串答案,去除前导0。

class Solution {
    public String largestNumber(int[] nums) {
        int n=nums.length;

        String[] str=new String[n];
        for(int i=0;i<n;i++){
            str[i]=""+nums[i];
        }
        Arrays.sort(str,(a,b)->{
            String sa=a+b;
            String sb=b+a;
            return sb.compareTo(sa);
        });
        String ans=new String();
        for(String s:str){
            ans+=s;
        }
        int k=0;
        int len=ans.length();
        while(k<len-1 && ans.charAt(k)=='0'){
            k++;
        }
        return ans.substring(k,len);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值