leetcode 1131. 绝对值表达式的最大值

题意:

给你两个长度相等的整数数组,返回下面表达式的最大值:

|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|

其中下标 ij 满足 0 <= i, j < arr1.length

思路:

根据数学思想,对于绝对值符号内的表达式( i > j ),共有四种可能

(1)arr1[i] > arr1[j] , arr2[i] > arr2[j]:arr1[i] - arr1[j] + arr2[i] - arr2[j] + i - j = ( arr1[i] + arr2[i] + i ) - ( arr1[j] + arr2[j] + j )

(2)arr1[i] > arr1[j] , arr2[i] < arr2[j]:arr1[i] - arr1[j] - arr2[i] + arr2[j] + i - j = ( arr1[i] - arr2[i] + i ) - ( arr1[j] - arr2[j] + j )

(3)arr1[i] < arr1[j] , arr2[i] > arr2[j]:- arr1[i] + arr1[j] + arr2[i] - arr2[j] + i - j = ( - arr1[i] + arr2[i] + i ) - ( - arr1[j] + arr2[j] + j )

(4)arr1[i] < arr1[j] , arr2[i] < arr2[j]:- arr1[i] + arr1[j] - arr2[i] + arr2[j] + i - j = ( - arr1[i] - arr2[i] + i ) - ( - arr1[j] - arr2[j] + j )

对于每一组(i,j),表达式的值必然属于上面四种情况的一种,并且所得到的值是四种情况中最大的,因此我们可以扫一遍数组,用当前值减去之前最小的值,再取一个最大值,就是所求的答案。

代码:

const int N=4e4+10;
class Solution {
public:
    int v[N][4],pre[4];
    int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
        int n = arr1.size();
        int ans=INT_MIN;
        for(int i = 0;i < n;i++){
            if(i==0){
                pre[0]=arr1[i] + arr2[i] + i;
                pre[1]=arr1[i] - arr2[i] + i;
                pre[2]=-arr1[i] + arr2[i] + i;
                pre[3]=-arr1[i] - arr2[i] + i;
            }
            else {
                ans=max(ans,arr1[i] + arr2[i] + i - pre[0]); pre[0]=min(pre[0],arr1[i] + arr2[i] + i);
                ans=max(ans,arr1[i] - arr2[i] + i - pre[1]); pre[1]=min(pre[1],arr1[i] - arr2[i] + i);
                ans=max(ans,-arr1[i] + arr2[i] + i - pre[2]); pre[2]=min(pre[2],-arr1[i] + arr2[i] + i);
                ans=max(ans,-arr1[i] - arr2[i] + i-pre[3]); pre[3]=min(pre[3],-arr1[i] - arr2[i] + i);
            }
        }
        return ans;
    }
};

原文地址:https://www.cnblogs.com/ljy08163268/p/11581975.html

时间: 2024-08-30 18:16:25

leetcode 1131. 绝对值表达式的最大值的相关文章

leetcode 410. 分割数组的最大值(二分法)

1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n) 示例: 输入: nums = [7,2,5,10,8] m = 2 输出: 18 解释: 一共有四种方法将nums分割为2个子数组. 其中最好的方式是将其分为[7,2,5] 和 [10,8], 因为此时这两个子数组各自的和的最大值为18,在所有情

正数最大值的绝对值比负数最大值的绝对值小一个

解答: 正数 0 - 32,767  共32768 个 负数 -1 - -32768 共32768 个 其中 0000000000000000 表示0,1000000000000000表示-32768 负数那个也算是人为的规定. 引用/*在计算机内,定点数有3种表示法:原码.反码和补码 所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小.     反码表示法规定:正数的反码与其原码相同:负数的反码是对其原码逐

Leetcode 282.给表达式添加运算符

给表达式添加运算符 给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+.- 或 * ,返回所有能够得到目标值的表达式. 示例 1: 输入: num = "123", target = 6 输出: ["1+2+3", "1*2*3"] 示例 2: 输入: num = "232", target = 8 输出: ["2*3+2", "2+3*2"] 示例

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置|最大值 -|- [1 3 -1] -3 5

矩阵连乘 和表达式加括号求最大值

矩阵连乘核心代码1 for(int i=0;i<=n;i++) 2 m[i][j]=0; 3 for(r=1;r<n;r++) 4 for(i=1;i<=n-r;i++) 5 { 6 j=i+r; 7 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; 8 s[i][j]=i; 9 for(k=i+1;k<j;k++) 10 { 11 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; 12 if(t<m[i][j]) 13

Codeforces 552E Vanya and Brackets(贪心 + 表达式计算)

题目链接 Vanya and Brackets 题目大意是给出一个只由1-9的数.乘号和加号组成的表达式,若要在这个表达式中加上一对括号,求加上括号的表达式的最大值. 我们发现,左括号的位置肯定是最左端或者某个乘号右边,右括号的位置肯定是最右段或者某个乘号左边. 而乘号最多只有15个,那么暴力枚举就可以了. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b);

UVA 10700-Camel trading(栈求表达式的最大最小值)

Camel trading Time Limit: 1 second Background Aroud 800 A.D., El Mamum, Calif of Baghdad was presented the formula 1+2*3*4+5, which had its origin in the financial accounts of a camel transaction. The formula lacked parenthesis and was ambiguous. So,

Codeforces 935E Fafa and Ancient Mathematics(表达式转树 + 树型DP)

题目链接  Codeforces Round #465 (Div. 2) Problem E 题意  给定一个表达式,然后用$P$个加号和$M$个减号填充所有的问号(保证问号个数等于$P + M$) 求可以形成的表达式的最大值. 先把表达式转成一棵树,然后在树上DP. 题目保证了$min(P, M) <= 100$, 为了提高效率,我们选择用少的运算符号作为DP的第二维. 对$P$和$M$的大小关系进行分类讨论. 当$P < M$时, 设$f[i][j]$表示$i$代表的子树里面填$j$个加号

Oracle分析函数

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --