方法1:java
1、首先对数组进行排序,使之成为递增顺序。
求一个数组的和sum,然后就是找到sum要减去的最大值。
这个最大值就是进行两次操作的时候要减去的数的总和。
2、因为数组是递增次数,因此我们如果要减去的元素是nums[ i ],那么从下标 i 到下标n-1全部都可以减去。
减去的部分就是 nums[ i ] * (n-i),因此我们可以遍历每个元素,减去1个之后,再对其排序再遍历减去第二个元素,找到能够减去的最大值。
3、最后sum减去最大值就是所求结果。
这里涉及一个Java数组的拷贝。
如果直接 res=nums; 的话,对res的修改会直接反应在nums上。
如果res=nums.clone();,则res是新地址的数组。
Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回两次操作后,数组元素之和的最小值
* @param nums int整型一维数组 这你你需要操作的数组
* @return long长整型
*/
public long minimumValueAfterDispel (int[] nums) {
// write code here
int n=nums.length;
//求和
int sum=0;
for (int i=0; i<n; i++){
sum+=nums[i];
}
//找减去的最大值
int maxnum=-1;
int var1=0,var2=0; //减去的2个值
int[] res= new int[]{};
res=nums.clone();//辅助数组
Arrays.sort(nums);
for (int i=0; i<n; i++){
var1=(n-i)*nums[i];
for (int k=i; k<n; k++){
res[k]-=nums[i];
}
Arrays.sort(res);
for (int j=0; j<n; j++){
var2=(n-j)*res[j];
maxnum = maxnum>var1+var2 ? maxnum : var1+var2;
}
res=nums.clone(); //恢复辅助函数
}
return sum-maxnum;
}
}
方法2:python
class Solution:
def minimumValueAfterDispel(self , nums ):
# write code here
n=len(nums)
res=list(nums)
nums.sort()
maxnum=0
sumnum=sum(nums)
for i in range(n):
var1=nums[i]*(n-i)
for j in range(i,n):
res[j]-=nums[i]
res.sort()
for k in range(n):
var2=res[k]*(n-k)
maxnum=max(maxnum,var1+var2)
res=list(nums)
return sumnum-maxnum