消消乐游戏算法java_Java算法题——牛牛消消乐

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值