题解 | #牧场奶牛集合区域#

牧场奶牛集合区域

https://www.nowcoder.com/practice/89218acf98234315af1cb3a223935318

    vector<vector<int> > findGatheringAreas(vector<int>& groups, int n) {
        // write code here
        // ︿( ̄︶ ̄)︿
        int i = 0, j = 0;// i指向数组,j指向res的行
        int incNum = groups[0];// 递增数
        vector<vector<int>> res;
        res.resize(1);
        res[0].push_back(groups[0]);
        while (i < n) {
            if (groups[i] == incNum) {//相等则i继续往后,inc继续自增
                if (i == n - 1) {//特判最后一个元素,防止遗漏
                    judge(res,j);
                    res[j].push_back(groups[i]);
                }
                i++;
                incNum++;
            } else {//不相等则本区间右端点入,j加一后新区间左端点入
                res[j].push_back(groups[i - 1]);
                j++;
                judge(res,j);
                res[j].push_back(groups[i]);
                incNum = groups[i] + 1;
                i++;
            }
        }
        for (auto& elem : res) {//特判区间长度为1的
            if (elem.size() == 1) {
                elem.push_back(elem[0]);
            }
        }
        return res;
    }

    void judge(vector<vector<int>> &res, int j) {//保证size编译通过
        if (j >= res.size()) {
            res.resize(j + 1);
        }
    }

第一种方法i指向数组,j指向res的行

第二种方法i指向右端点+1,j指向左断点,为一个左闭右开区间,新增一个k指向res的行

vector<vector<int> > findGatheringAreas(vector<int>& groups, int n) {
        // write code here
        int i = 0, j = 0, k = 0;
        int incNum = groups[0];
        vector<vector<int>> res;
        while (i < n) {
            if (incNum != groups[i]) {
                judge(res, k);
                res[k].push_back(groups[j]);
                res[k].push_back(groups[i - 1]);
                k++;
                j = i;
                incNum = groups[i];
            } else {
                i++;
                incNum++;
            }
        }
        judge(res, k);
        res[k].push_back(groups[j]);
        res[k].push_back(groups[i - 1]);
        return res;
    }

    // 确保 res[j] 存在
    void judge(vector<vector<int>>& res, int k) {
        if (k >= res.size()) {
            res.resize(k + 1);
        }
    }

全部评论

相关推荐

09-14 20:51
四川大学 Java
慢热的鲸鱼在学习:985加粗就行了,第二个项目来不及准备也没事,省的写了问你你还不会。你只需准备面试八股和项目场景,剩下的交给985。即使面不过也没事,面试经验是最重要的,你现在不缺时间
简历中的项目经历要怎么写
点赞 评论 收藏
分享
勇敢的90后想交流:我愿意付费上班,楼主你就安心字节待着吧,我是真的喜欢上班
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务