5505. La mayor suma de todas las permutaciones

Descripción del Título:

Hay una serie de enteros numsy una serie de consultas requests, que requests[i] = [starti, endi]. La evaluación nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi]de los resultados de la i-ésima consulta startiy endiel índice de la matriz es desde 0el principio.

Puede organizar cualquiera de numslos números, devuelva el valor máximo de la suma de todos los resultados de la consulta.

Dado que la respuesta puede ser muy grande, se le pedirá que 1000000007regrese después de más de una toma.

Ejemplo 1:

输入:nums = [1,2,3,4,5], requests = [[1,3],[0,1]]
输出:19
解释:一个可行的 nums 排列为 [2,1,3,4,5],并有如下结果:
requests[0] -> nums[1] + nums[2] + nums[3] = 1 + 3 + 4 = 8
requests[1] -> nums[0] + nums[1] = 2 + 1 = 3
总和为:8 + 3 = 11。
一个总和更大的排列为 [3,5,4,2,1],并有如下结果:
requests[0] -> nums[1] + nums[2] + nums[3] = 5 + 4 + 2 = 11
requests[1] -> nums[0] + nums[1] = 3 + 5  = 8
总和为: 11 + 8 = 19,这个方案是所有排列中查询之和最大的结果。

Ejemplo 2:

输入:nums = [1,2,3,4,5,6], requests = [[0,1]]
输出:11
解释:一个总和最大的排列为 [6,5,4,3,2,1] ,查询和为 [11]

Ejemplo 3:

输入:nums = [1,2,3,4,5,10], requests = [[0,2],[1,3],[1,1]]
输出:47
解释:一个和最大的排列为 [4,10,5,3,2,1] ,查询结果分别为 [19,18,10]

rápido:

n == nums.length
1 <= n <= 100000
0 <= nums[i] <= 100000
1 <= requests.length <= 100000
requests[i].length == 2
0 <= starti <= endi < n

Ideas de resolución de problemas:

La primera es entender el significado de la pregunta ::
numsLa posición del número en se puede cambiar a voluntad ;:
requestsAlmacena la primera y última información de posición de cada matriz de consulta (starti, endi);
resolver el problema equivale a hallar el producto máximo de la cantidad de veces que aparece cada número, es decir es sum(nums[i] * time);
para obtener el resultado máximo, hay más número de valores de posición es relativamente grande;
ejemplo: nums = [1,2,3,4,5], requests = [[1,3],[0,1]]
1), la posición 1aparece dos veces nums[1] = 5;
2), la posición 0,2,3aparece una vez, respectivamente 4,3,2;

Dificultad : cuenta el número de ocurrencias de cada posición;
vector Intime: registra el grado de entrada de la posición actual;
vector Outtime: registra el grado de salida de la posición actual;
vector Rtime: registra el número de ocurrencias de la posición actual;

Código:


class Solution {
    
    
public:

    int maxSumRangeQuery(vector<int>& nums, vector<vector<int>>& requests) {
    
    
        long long ret = 0 ;
        vector<int> Intime(nums.size() , 0) ;
        vector<int> Outtime(nums.size() , 0) ;
        vector<int> Rtime(nums.size() , 0) ;
        int i , j ;
        // 计算 i 位置的出度和入度信息 ;
        for (i = 0 ; i < requests.size() ; i ++)
        {
    
    
            Intime[requests[i][0]] ++ ;
            Outtime[requests[i][1]] ++ ;
        }
        int innum = 0 ;
        //统计 i 位置出现的次数 ;
        for(i = 0 ; i < nums.size() ; i ++)
        {
    
    
            innum +=  Intime[i] ;
            Rtime[i] = innum ;
            innum -= Outtime[i] ; 
        }
        //按照i位置出现的次数排序 ;
        sort(Rtime.begin() , Rtime.end()) ;
        // 按照 数字的大小排序
        sort(nums.begin() , nums.end()) ;
        //ret 即为所求的结果 为 ret += Rtime[i] * nums[i] ;
        for (i = nums.size() - 1 ; i > -1 ; i --)
        {
    
    
            if (Rtime[i] == 0) break ;
            ret += (long long) Rtime[i] * nums[i] ;
        }
        return ret % 1000000007 ;

    }
};

complejidad del tiempo:

Espacio O(n)complejidad:;
tiempo de complejidad: O(nlogn);

Supongo que te gusta

Origin blog.csdn.net/u010155337/article/details/108687882
Recomendado
Clasificación