using System; using System.Collections.Generic; using System.Linq;
publicclassGroupChecker { publicstaticboolCanGroup(List<int> nums) { int n = nums.Count; int i = 0, j = 1, k = 2; bool sign = true;
// 若数组长度不是3的倍数,则无法分组 if (n % 3 != 0) returnfalse;
nums.Sort(); List<int> newNums = new List<int>(nums);
// 查找相同的3个数,并标记为已分组(使用-1表示已分组) while (i < n - 2) { if (nums[i] == nums[i + 1] && nums[i + 1] == nums[i + 2]) { newNums[i] = newNums[i + 1] = newNums[i + 2] = -1; i += 3; } else { i++; } }
i = 0; // 查找连续3个数,并标记为已分组(使用-1表示已分组) while (k < n) { while (i < j && newNums[i] == -1) i++; while (j < k && newNums[j] == -1) j++; while (k < n && newNums[k] == -1) k++;
foreach (var num in newNums) { if (num != -1) sign = false; }
if (!sign) { i = 0; j = 1; k = 2; newNums = new List<int>(nums);
// 查找连续3个数,并标记为已分组(使用-1表示已分组) while (k < n) { while (i < j && newNums[i] == -1) i++; while (j < k && newNums[j] == -1) j++; while (k < n && newNums[k] == -1) k++;
if (k < n && newNums[i] + 1 == newNums[j] && newNums[j] + 1 == newNums[k]) { newNums[i] = newNums[j] = newNums[k] = -1; } else { if (k < n && newNums[i] + 2 != newNums[k]) k++; if (j < k && newNums[i] + 1 != newNums[j]) j++; } }
i = 0; // 查找相同3个数,并标记为已分组(使用-1表示已分组) while (i < n - 2) { while (i < n - 2 && (newNums[i] == -1 || newNums[i + 1] == -1 || newNums[i + 2] == -1)) i++; if (i < n - 2 && newNums[i] == newNums[i + 1] && newNums[i + 1] == newNums[i + 2]) { newNums[i] = newNums[i + 1] = newNums[i + 2] = -1; i += 3; } else { i++; } }
for (int m = 0; m < n; m++) { if (newNums[m] != -1) returnfalse; } }