描述
给定一个数组 nums,其中有 n 个非负整数。你的目的是进行两次操作,使得数组的元素之和最小。
每次操作形如:任选一个整数 x ,将数组中所有大于等于 x 的数减去 x 。
示例1
输入:
[2,1,3]
复制返回值:
0
复制说明:
初始数组为 [2, 1, 3]。
先选择 x = 2,则所有大于等于 2 的元素减去 2 ,变成 [0, 1, 1]。
再选择 x = 1,则所有大于等于 1 的元素减去 1 ,变成 [0, 0, 0]。
所以数组元素之和的最小值为 0。
备注:
对于所有的测试数据,保证有1≤n≤30001≤n≤3000 且 0≤numi≤231−10≤numi≤231−1 。
解题思路:
就直接暴力的遍历两次求解就行了,n才3000,应该不会超时的。注意的是中间的tenp和nums的使用,因为循环里的-=内操作会把temp的值覆盖掉,所以一定要减nums噢~
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回两次操作后,数组元素之和的最小值
* @param nums int整型vector 这你你需要操作的数组
* @return long长整型
*/
long long minimumValueAfterDispel(vector<int>& nums) {
// write code here
long long len = nums.size();
sort(nums.begin(),nums.end());
long long sum=0;
for(int i=0;i<len;i++){
sum+=nums[i];
}
vector<int> temp = nums;
long long minn = sum;
for(int i=0;i<len;i++){
for(int j=i;j<len;j++){
temp[j]-=nums[i]; //这个nums不能用temp,因为会覆盖
}
long long res = sum-nums[i]*(len-i); //这个nums不能用temp,因为会覆盖
sort(temp.begin(),temp.end());
for(int j=0;j<len;j++){
if((res-temp[j]*(len-j))<minn){
minn=(res-temp[j]*(len-j));
}
}
temp=nums;
}
return minn;
}
};