LeetCode-228. Intervalo de resumen

descripción

Dada una matriz de números enteros ordenados sin elementos repetidos.

Devuelve una lista de los rangos de rango ordenados más pequeños que cubren todos los números de la matriz. En otras palabras, cada elemento de nums está cubierto exactamente por un cierto rango, y no hay un número x que pertenezca a un cierto rango pero no pertenezca a nums.

Cada intervalo de intervalo [a, b] de la lista debe aparecer en el siguiente formato:

"a-> b" si a! = b
"a" si a == b
 

Ejemplo 1:

Entrada: nums = [0,1,2,4,5,7]
Salida: ["0-> 2", "4-> 5", "7"]
Explicación: El rango de intervalo es:
[0,2] - -> "0-> 2"
[4,5] -> "4-> 5"
[7,7] -> "7"
Ejemplo 2:

Entrada: nums = [0,2,3,4,6,8,9]
Salida: ["0", "2-> 4", "6", "8-> 9"]
Explicación: El intervalo de intervalo es :
[0,0] -> "0"
[2,4] -> "2-> 4"
[6,6] -> "6"
[8,9] -> "8-> 9 "
Ejemplo 3:

Entrada: nums = []
Salida: []
Ejemplo 4:

Entrada: nums = [-1]
Salida: ["-1"]
Ejemplo 5:

Entrada: nums = [0]
Salida: ["0"]
 

rápido:

0 <= nums.length <= 20-231 <=
nums [i] <= 231-1
Todos los valores en
nums son diferentes entre sí los nums están ordenados en orden ascendente

Fuente:
Enlace de LeetCode : https://leetcode-cn.com/problems/summary-ranges/

Resolver

   class Solution {
    public:
        // 第一版本,代码比较冗余
        vector<string> summaryRanges_1e(const vector<int> &nums) {
            vector<string> res;
            if (nums.empty()) {
                return res;
            }
            int i = 0;
            int j = i + 1;
            const int n = nums.size();
            while (i < n && j < n) {
                // 连续区间,继续递增
                if (nums[j] == nums[j - 1] + 1) {
                    ++j;
                    continue;
                }

                // 连续区间终止
                if (nums[i] == nums[j - 1]) {
                    // 连续区间只有一个值
                    res.emplace_back(std::to_string(nums[i]));
                    i = j;
                    ++j;
                    continue;
                }
                // 连续区间是一个有效区间
                res.emplace_back(std::to_string(nums[i]) + "->" + std::to_string(nums[j - 1]));
                i = j;
                ++j;
            }

            // 遍历结束,处理最后一个区间
            if (nums[i] == nums[j - 1]) {
                // 连续区间只有一个值
                res.emplace_back(std::to_string(nums[i]));
                return res;
            }
            res.emplace_back(std::to_string(nums[i]) + "->" + std::to_string(nums[j - 1]));
            return res;
        }

        // 第二版本,代码精简版,参考官方题解
        vector<string> summaryRanges(const vector<int> &nums) {
            vector<string> res;
            int i = 0;
            const int n = nums.size();
            while (i < n) {
                int low = i;
                ++i;
                while (i < n && (nums[i] == nums[i - 1] + 1)) {
                    ++i;
                }
                int high = i - 1;
                string str = std::to_string(nums[low]);
                if (low < high) {
                    str.append("->");
                    str.append(std::to_string(nums[high]));
                }
                res.push_back(std::move(str));
            }
            return res;
        }
    };

 

Supongo que te gusta

Origin blog.csdn.net/u010323563/article/details/112426886
Recomendado
Clasificación