import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param groups int整型一维数组
     * @param n int整型
     * @return int整型二维数组
     */
    public int[][] findGatheringAreas (int[] groups, int n) {
        int slow = 0;
        int fast = 0;
        ArrayList<int[]> arrayList = new ArrayList<>();
	   // 寻找聚集区域
        while (slow < n) {
		  // 找到聚集区域的结束位置
            while (fast + 1 < n && groups[fast] + 1 == groups[fast + 1]) {
                fast++;
            }
		   // 将聚集区域的起始位置和结束位置添加到数组列表
            arrayList.add(new int [] {groups[slow], groups[fast]});
		    // 更新指针位置以继续寻找下一个聚集区域
            slow = fast + 1;
            fast = slow;
        }
	      // 将数组列表转换为二维数组
        int [][] result = new int[arrayList.size()][2];
        for (int i = 0; i < arrayList.size(); i++) {
            result[i] = arrayList.get(i);
        }
        return result;
    }
}

本题知识点分析:

1.数组遍历

2.双指针或者叫快慢指针

3.集合和数组的转换

本题解题思路分析:

1.int slow = 0;:定义慢指针 slow,表示聚集区域的起始位置。int fast = 0;:定义快指针 fast,用于寻找聚集区域的结束位置。

2.ArrayList<int[]> arrayList = new ArrayList<>();:创建一个数组列表 arrayList,用于存储聚集区域的起始和结束位置。

3.while (slow < n) { ... }:外层循环,当慢指针 slow 小于数组长度 n 时,继续寻找聚集区域。

4.while (fast + 1 < n && groups[fast] + 1 == groups[fast + 1]) { ... }:内层循环,当快指针 fast 加 1 仍小于 n 且相邻元素连续时,更新快指针 fast。

5.arrayList.add(new int[] {groups[slow], groups[fast]});:将找到的聚集区域的起始位置和结束位置以数组的形式添加到数组列表 arrayList。

6.slow = fast + 1;:更新慢指针 slow,指向下一个未检查的元素。fast = slow;:将快指针 fast 更新为慢指针 slow,准备寻找下一个聚集区域。

7.将集合中元素取出,转化成符合题目要求的二维数组即可

本题使用编程语言: Java