给你一个下标从 0 开始的整数数组 nums
。
如果下标三元组 (i, j, k)
满足下述全部条件,则认为它是一个 山形三元组 :
i < j < k
nums[i] < nums[j]
且nums[k] < nums[j]
请你找出 nums
中 元素和最小 的山形三元组,并返回其 元素和 。如果不存在满足条件的三元组,返回 -1
。
提示:
3 <= nums.length <= 50
1 <= nums[i] <= 50
方法一:
由于提示给出的数据范围是很小的,所以可以选择暴力求解:
class Solution {
public int minimumSum(int[] nums) {
int i,j,k;
int minSum = Integer.MAX_VALUE;
for(i=0;i<nums.length-2;i++){
for(j=i+1;j<nums.length-1;j++){
for(k=j+1;k<nums.length;k++){
if (nums[i] < nums[j] && nums[k] < nums[j]) {
int sum = nums[i] + nums[j] + nums[k];
minSum = Math.min(minSum, sum);
}
}
}
}
if (minSum == Integer.MAX_VALUE) {
return -1; // 没有满足条件的山形三元组
} else {
return minSum;
}
}
}
但是,当提示给出大范围的时候。
3 <= nums.length <= 105
1 <= nums[i] <= 108
用上述方法会超时。
方法二:
class Solution {
public int minimumSum(int[] nums) {
int[]leftMin=new int[nums.length];
int[]rightMin=new int[nums.length];
leftMin[0]=nums[0];
for(int i=1;i<nums.length;i++){
leftMin[i]=Math.min(leftMin[i-1],nums[i]);
}
rightMin[nums.length-1]=nums[nums.length-1];
for(int i=nums.length-2;i>=0;i--){
rightMin[i]=Math.min(nums[i],rightMin[i+1]);
}
int res=Integer.MAX_VALUE;
for(int i=1;i<nums.length-1;i++){
if(leftMin[i-1]<nums[i]&&rightMin[i+1]<nums[i]){
res=Math.min(res,leftMin[i-1]+nums[i]+rightMin[i+1]);
}
}
return res==Integer.MAX_VALUE?-1:res;
}
}
return里的意思是,如果res=Integer.MAX_VALUE,返回-1;
如果不等于,则返回res,即最小和。
当然我用的是java,其实c++的写法和Java很像。