leetcode 305 union find

图片.png
  • 重点:
  1. & 符号决定代码速度:
    for (auto &bb : dics)
    int find(vector<int>& end, int id)
  2. continue 也是比正常if 快:
    if (x < 0 || x >= m || y < 0 || y >= n || end[cur_id] == -1)
    continue;
    or
    if (x >= 0 && x < m&& y >= 0 && y < n && end[cur_id] != -1)

这类题目考察核心 或者说影响运行速度核心就是find()函数是如何写的:

  1. 快速的做法 不采用递归:
int findRoot(vector<int>& roots, int i) {//没有用递归
            while (roots[i] != i) {
                roots[i] = roots[roots[i]];
                i = roots[i];
            }
            return i;
        }
  1. 我的递归,超级烂:
int find(vector<int>& end, int id) {
        if (end[id] == id)
            return id;
        return find(end, end[id]);
    }
  • code
class Solution {
public:
    int find(vector<int>& roots, int i) {//没有用递归
            while (roots[i] != i) {
                roots[i] = roots[roots[i]];
                i = roots[i];
            }
            return i;
        }
    vector<int> numIslands2(int m, int n, vector<pair<int, int>>& positions) {
        vector<int> end(m*n, -1);
        vector<vector<int>> dics = { {0,1},{1,0},{0,-1},{-1,0} };
        int cnt = 0;
        vector<int>ans;
        for (auto& aa : positions) {
            int id = n * aa.first + aa.second;
            if (end[id] == -1) {
                end[id] = id;
                cnt++;
            }
            for (auto &bb : dics) {
                int x = bb[0] + aa.first, y = bb[1] + aa.second, cur_id = x * n + y;
                //if (x >= 0 && x < m&& y >= 0 && y < n && end[cur_id] != -1) 
                if (x < 0 || x >= m || y < 0 || y >= n || end[cur_id] == -1) continue;
                {
                    int t1 = find(end, cur_id), t2 = find(end, id);
                    if (t1 != t2) {
                        cnt--;
                        end[t1] = t2;
                    }

                }
            }
            ans.push_back(cnt);
        }
        return ans;
    }
};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,751评论 0 2
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 4,965评论 0 1
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,679评论 0 89
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,154评论 0 2
  • 生活真的很不称意,看不到希望,但是,这又有什么关系呢,只是你还活着,你还有一颗心,就会有无限希望。
    韩古行阅读 1,384评论 1 0