import java.util.*;public classSolution {/*** 返回两次操作后,数组元素之和的最小值
*@paramnums int整型一维数组 这你你需要操作的数组
*@returnlong长整型*/
public long minimumValueAfterDispel (int[] nums) {//write code here
Arrays.sort(nums);long sum = 0;//记录整个数组的和
long max = 0;//记录能够减去的最大值
for(int j=0;j
sum+=nums[j];int index1 =j;int index2 =j;int index3 =j;for(int i=0;i<=j;i++){while(index1 > 0 && nums[index1-1] >= nums[j]-nums[i]){
index1--;
}while(index2 > i && nums[index2-1] >= nums[j]-nums[i]){
index2--;
}while(index3 < nums.length && (long)nums[index3] < (long)nums[i]+nums[j]){
index3++;
}/*假设两次减去的数为a,b(a
1.a=nums[j]-nums[i] b=nums[i]
2.a=nums[i] b=nums[j]-nums[i]
3.a=nums[i] b=nums[j]
分段函数的边界:
1. index1 < i < j < nums.length 其实index1大于i时不碍事 i-index1变成负数不会影响max的计算
2. i < index2 < j < nums.length
3. i < j < index3 < nums.length
对于第一种情况 index1到i之间的数只能减去a 即 nums[j]-nums[i], i到j之间的数只能减去b 即nums[i] , j到最后的数可以减去a+b 即nums[j]
对于第二种情况 i到index2之间的数只能减去a 即 nums[i], index2到j之间的数只能减去b 即nums[j]-nums[i] , j到最后的数可以减去a+b 即nums[j]
对于第三种情况 i到j之间的数只能减去a 即 nums[i], j到index3之间的数只能减去b 即nums[j], index3到最后的数可以减去a+b 即nums[j]+nums[i]*/
long tmp1 = (i-index1)*((long)nums[j]-nums[i]) + (j-i)*(long)nums[i] + (nums.length-j)*(long)nums[j];long tmp2 = (index2-i)*((long)nums[i]) + (j-index2)*((long)nums[j]-nums[i]) + (nums.length-j)*(long)nums[j];long tmp3 = (j-i)*(long)nums[i] + (index3-j)*(long)nums[j] + (nums.length-index3)*((long)nums[i]+nums[j]);
max=Math.max(max,tmp1);
max=Math.max(max,tmp2);
max=Math.max(max,tmp3);
}
}return sum -max;
}
}