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