题解 | #牧场奶牛集合区域#
牧场奶牛集合区域
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); } }