import java.util.*;
/**
* NC414 小红的最小三角形周长
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 相似 -> NC254 合法的三角形个数 [nowcoder]
*
* @param nums int整型ArrayList
* @return int整型
*/
public int hongstriangle (ArrayList<Integer> nums) {
// return solution1(nums);
// return solution2(nums);
return solution3(nums);
}
/**
* 二分
* @param nums
* @return
*/
private int solution1(ArrayList<Integer> nums){
Collections.sort(nums);
int n = nums.size();
long result = Long.MAX_VALUE;
long target;
int left,right,mid,cnt;
long sum;
// 三角形两边之和大于第三边
for(int i=0; i<n; i++){
for(int j=i+1; j<n-1; j++){
// 当前最小的三边之和(可能不合法)
sum = (long) nums.get(i)+nums.get(j)+nums.get(j+1);
if(sum >= result){
break;
}
// 两条短边之和
target = (long) nums.get(i)+nums.get(j);
// 二分
left = j+1;
right = n-1;
while(left <= right){
mid = (left+right)/2;
if(nums.get(mid) < target){
left = mid+1;
}else{
right = mid-1;
}
}
// 可选第三边个数
cnt = (left-j-1);
if(cnt > 0){
result = sum;
}
}
}
return (int)result;
}
/**
* 双指针
* @param nums
* @return
*/
private int solution2(ArrayList<Integer> nums){
Collections.sort(nums);
int n = nums.size();
long result = Long.MAX_VALUE;
long target;
long sum;
// 三角形两边之和大于第三边
for(int i=0; i<n; i++){
for(int j=i+1; j<n-1; j++){
// 当前最小的三边之和(可能不合法)
sum = (long) nums.get(i)+nums.get(j)+nums.get(j+1);
if(sum >= result){
break;
}
// 两条短边之和
target = (long) nums.get(i)+nums.get(j);
if(target > nums.get(j+1)){
result = sum;
}
}
}
return (int)result;
}
/**
* 二分
* @param nums
* @return
*/
private int solution3(ArrayList<Integer> nums){
Collections.sort(nums);
int n = nums.size();
int result = Integer.MAX_VALUE;
int target;
int left,right,mid;
// 较大两边索引一定相邻(连续)!
for(int i=2; i<n; i++){
// A+B>C => A>C-B 第三条最小边大于target
target = nums.get(i)-nums.get(i-1);
left = 0;
right = i-2;
while(left <= right){
mid = left+(right-left)/2;
// left最终指向第一个大于target的位置
if(nums.get(mid) <= target){
left = mid+1;
}else{
right = mid-1;
}
}
if(left <= i-2){
result = Math.min(result, nums.get(left)+nums.get(i)+nums.get(i-1));
}
}
return result;
}
}