Descripción del Título:
Hay una serie de enteros nums
y 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 starti
y endi
el índice de la matriz es desde 0
el principio.
Puede organizar cualquiera de nums
los 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 1000000007
regrese 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 ::
nums
La posición del número en se puede cambiar a voluntad ;:
requests
Almacena 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 1
aparece dos veces nums[1] = 5
;
2), la posición 0,2,3
aparece 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)
;