【算法经典--leetcode】省份数量问题

总结

  1. 无论哪种方法在标记之前一定要有判断标记的操作,这样会防止死循环现象,无论你是否理解这都是一个保险的操作
  2. 对于图的遍历有几个要素:一定有一个visited数组来进行标记。
  3. dfs经典递归,bfs经典队列,在一些模拟题当中还可以使用直接遍历的方式两层for循环
  4. 对于并查集还需要判断层高才能够按规则合并,因此还要有一个level数组。
  5. level的增加情况只有在两个要合并的树是相同的层高才会出现加一,因为我们已经约定了低层高的树要并入高层树,这样层高是不会改变的。

dfs方法

static int getProvince(int[][] cities){
        boolean[] visited = new boolean[cities.length];
        int count = 0;
        for(int i = 0 ; i < visited.length ; i++ ){
            if(visited[i] != true){
                dfs(cities , i , visited);
                count++;
            }
        }
        return count;
    }

    private static void dfs(int[][] cities , int index , boolean[] visited) {
        for(int i = index ; i < cities.length ; i++){
            for( int  j = i+1 ; j < cities.length ; j++){
                if(cities[i][j] == 1 && !visited[j]){
                    visited[j] = true;
                    dfs(cities , j , visited);
                }
            }
        }
    }

bfs方法

bfs的经典思想就是队列

private static int bfs(int[][] cities ){
        Queue<Integer> queue = new LinkedList<>();
        boolean[] visited = new boolean[cities.length];
        int count = 0;
        for(int i = 0 ; i < cities.length ; i++){
            if(!visited[i]){
                queue.offer(i);
                visited[i] = true;
                while(!queue.isEmpty()){
                    int tmp = queue.poll();
                        for(int j1 = 0 ; j1 < cities.length ; j1++){
                            if(cities[tmp][j1] == 1 && !visited[j1]){//visited很重要,否则会出现死循环一直入队的现象
                                visited[j1] = true;//可以记为:在标记之前一定有判断是否已经标记的操作
                                queue.offer(j1);
                            }
                        }
                }
                count++;
            }
        }
        return count;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值