import java.util.*; 公共类解决方案{/* * *返回两次操作后数组元素之和的最小值
*@paramnums int整数一维数组您需要操作的数组
*@returnlong长整数*/
publiclongminimumvalueafterdispel (int [ ] nums ) ) {//write代码here
Arrays.sort(NUMS ); long sum=0; //记录整个数组的和
长最大=0; //记录可减去的最大值
for(intj=0; Jj
sum=nums[j]; int index1=j; int index2=j; int index3=j; for(intI=0; i=j; I () while )索引10 nums [ index1-1]=nums [ j ]-nums [ I ] ) )
索引1-- -;
} while (index2inums [ index2-1]=nums [ j ]-nums [ I ] ) )
索引2-- -;
}while(index3nums.length(long ) nums[index3] ) long (nums [ I ] nums [ j ] ) {
索引3;
(/)假设减去2次的数为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 .索引1 I j nums.length实际上索引1大于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到索引2的数量只能减去a即nums[i],索引2到j的数量只能减去b即nums[j]-nums[i],而j到最后的数量是a b即nums[j]
第三种情况I到j的数量为a的nums[i],j到索引3的数量为b的nums[j],从索引3到最后的数量为a b的nums[j] nums[i]*/
longtmp1=(I-index1) (long ) nums [ j ]-nums [ I ] (j-I ) * (long ) nums [ j ] (nums.length-j ) ) ) ) ) long ) nums.length-j longtMP3=(j-I ) (long ) nums ) I ) ) index3-j ) (long ) nums.length-index3) ) )
max=math.max(max,tmp1;
max=math.max(max,tmp2;
max=math.max(max,tmp3 );
}
}返回和最大;
}
}