2874. 有序三元组中的最大值 II

提示:海柔笔试,所以第一次玩力扣


题目

给你一个下标从 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!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值