提示:海柔笔试,所以第一次玩力扣
题目
给你一个下标从 0 开始的整数数组 nums 。
请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回 0 。
下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k] 。
提示:以下是本篇文章正文内容,下面案例可供参考
1、法一:暴力3重循环O(N3)
第一次报错:(nums[i] - nums[j]) * nums[k] 溢出;
第二次报错:超时
long long maximumTripletValue(int* nums, int numsSize) {
int i,j,k;
long long max = 0;
long long temp = 0;
for(i = 0; i < (numsSize-2); i++){
for(j = i+1; j < (numsSize-1); j++){
for(k = j+1; k < numsSize; k++){
temp = (nums[i] - nums[j]) * 1L * nums[k]; //第一次报错溢出,故加上*1L
if (temp > max) max = temp;
}
}
}
return max;
}
2、法二:O(N2)
遍历j,对于每个j,寻找i<j时的最大Num[i],寻找j<k时的最大Num[k]
报错:超时
long long maximumTripletValue(int* nums, int numsSize) {
int i,j,k;
int max_i = 0, max_k = 0;
long long max = 0;
long long temp = 0;
for(j = 1; j < (numsSize-1); j++){
for(i = 0; i < j; i++){
if (nums[i] > max_i) max_i = nums[i];
}
for(k = j+1; k < numsSize; k++){
if (nums[k] > max_k) max_k = nums[k];
}
temp = (max_i - nums[j]) * 1L * max_k;
if (temp > max) max = temp;
max_k = nums[numsSize-1]; //max_k设初始值,避免重复
}
return max;
}
简化了nums[i],依旧超时
long long maximumTripletValue(int* nums, int numsSize) {
int i,j,k;
int max_i = nums[0];
int max_k = nums[numsSize-1];
long long max = 0;
long long temp = 0;
for(j = 1; j < (numsSize-1); j++){
if (nums[j-1] > max_i) max_i = nums[j-1];
for(k = j+1; k < numsSize; k++){
if (nums[k] > max_k) max_k = nums[k];
}
temp = (max_i - nums[j]) * 1L * max_k;
if (temp > max) max = temp;
max_k = nums[numsSize-1]; //max_k初始化
}
return max;
}
3、法三:O(N)
不会啊,先放弃,考虑一下是否要继续力扣,想一下自己的初心。这是做的第一道力扣,没事的,咱从第一题开始刷TMD!