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

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

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

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

 

示例 1:

输入:arr1 = [1,2,3,4], arr2 = [-1,4,5,6]
输出:13
示例 2:

输入:arr1 = [1,-2,-5,0,10], arr2 = [0,-2,-1,-7,-4]
输出:20
 

提示:

2 <= arr1.length == arr2.length <= 40000
-10^6 <= arr1[i], arr2[i] <= 10^6

 

分析:

首先把绝对值符号去掉,展开表达式:
 

|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|
 =  (arr1[i] + arr2[i] + i) - (arr1[j] + arr2[j] + j)
 =  (arr1[i] + arr2[i] - i) - (arr1[j] + arr2[j] - j)
 =  (arr1[i] - arr2[i] + i) - (arr1[j] - arr2[j] + j)
 =  (arr1[i] - arr2[i] - i) - (arr1[j] - arr2[j] - j)
 = -(arr1[i] + arr2[i] + i) + (arr1[j] + arr2[j] + j)
 = -(arr1[i] + arr2[i] - i) + (arr1[j] + arr2[j] - j)
 = -(arr1[i] - arr2[i] + i) + (arr1[j] - arr2[j] + j)
 = -(arr1[i] - arr2[i] - i) + (arr1[j] - arr2[j] - j)


 
因为存在四组两两等价的展开,所以可以优化为四个表达式:

A = arr1[i] + arr2[i] + i
B = arr1[i] + arr2[i] - i
C = arr1[i] - arr2[i] + i
D = arr1[i] - arr2[i] - i

max( |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|)
= max(max(A) - min(A),
      max(B) - min(B),
      max(C) - min(C),
      max(D) - min(D))

代码实现:

class Solution {
public:
    int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
//         |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|
    /*
    A = arr1[i] + arr2[i] + i
    B = arr1[i] + arr2[i] - i
    C = arr1[i] - arr2[i] + i
    D = arr1[i] - arr2[i] - i

    max( |arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|)
    = max(max(A) - min(A),
      max(B) - min(B),
      max(C) - min(C),
      max(D) - min(D))
    */
        int max_a,min_a,max_b,min_b,max_c,min_c,max_d,min_d;
        max_a=min_a=max_b=min_b=max_c=min_c=max_d=min_d=0;
        for(int i=0; i<arr1.size(); i++){
            int temp = arr1[i]+arr2[i]+i;
            max_a = temp>max_a?temp:max_a;
            min_a = temp<min_a?temp:min_a;
            
            temp = arr1[i]+arr2[i]-i;
            max_b = temp>max_b?temp:max_b;
            min_b = temp<min_b?temp:min_b;
            
            temp = arr1[i]-arr2[i]+i;
            max_c = temp>max_c?temp:max_c;
            min_c = temp<min_c?temp:min_c;
            
            temp = arr1[i]-arr2[i]-i;
            max_d = temp>max_d?temp:max_d;
            min_d = temp<min_d?temp:min_d;
        }
        int max = max_a - min_a;
        max = max_b-min_b>max?max_b-min_b:max;
        max = max_c-min_c>max?max_c-min_c:max;
        max = max_d-min_d>max?max_d-min_d:max;
        return max;
        
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最重要的一点:从本版开始本软件全部功能完全免费使用。 【一 概述】 易算数学公式计算器 易算数学公式计算器(易算器)是一款非常简单好用的公式计算器,您可以使 用并保存带变量的公式,在运行时只需要在变量列表中填入数据,就可以生 成结果列表,相信使用它可以减少您许多重复工作。 1 可以计算一般代数式,比如“1 + cos(2)”。 2 可在表达式中使用变量,包括中文变量名,比如“电压=电阻*电流”。在 求值时,软件自动提示输入变量的值并进行计算。 3 支持常用函数如三角函数、对数、乘方等,及逻辑函数如>, 大于 (1>0 )=1 < 小于 (1<0 )=0 <= 不大于 (1= 不小于 (1>=0)=1 == 等于 (1==0)=0 不等于 (10)=1 5 逻辑运算符 &或and 字节与 8 and 7 =7 |或or 字节或 8 or 7 =15 !或not 逻辑非 not 1 =0 6 补充公式 max max(a,b) 求a,b两数较大值 min min(a,b) 求a,b两数较小值 T2E_S(T) 已知温度T,求S型热电偶热电势(单位:mV) T2E_N(T) 已知温度T,求N型热电偶热电势(单位:mV) T2E_R(T) 已知温度T,求R型热电偶热电势(单位:mV) T2E_E(T) 已知温度T,求E型热电偶热电势(单位:mV) T2E_B(T) 已知温度T,求B型热电偶热电势(单位:mV) T2E_J(T) 已知温度T,求J型热电偶热电势(单位:mV) T2E_K(T) 已知温度T,求K型热电偶热电势(单位:mV) T2E_T(T) 已知温度T,求T型热电偶热电势(单位:mV) T2E_WRE325(T) 已知温度T,求WRE-325型热电偶热电势(单位:mV) T2E_WRE526(T) 已知温度T,求WRE-526型热电偶热电势(单位:mV) E2T_S(E) 已知热电势E,求S型热电偶温度(单位:℃) E2T_N(E) 已知热电势E,求N型热电偶温度(单位:℃) E2T_R(E) 已知热电势E,求R型热电偶温度(单位:℃) E2T_E(E) 已知热电势E,求E型热电偶温度(单位:℃) E2T_B(E) 已知热电势E,求B型热电偶温度(单位:℃) E2T_J(E) 已知热电势E,求J型热电偶温度(单位:℃) E2T_K(E) 已知热电势E,求K型热电偶温度(单位:℃) E2T_T(E) 已知热电势E,求T型热电偶温度(单位:℃) E2T_WRE325(E) 已知热电势E,求WRE-325型热电偶温度(单位:℃) E2T_WRE526(E) 已知热电势E,求WRE-526型热电偶温度(单位:℃) T2R_PT10(T) 已知温度T,求PT10型热电阻电阻值(单位:Ω) T2R_PT100(T) 已知温度T,求PT100型热电阻电阻值(单位:Ω) T2R_PT1000(T) 已知温度T,求PT1000型热电阻电阻值(单位:Ω) T2R_CU50(T) 已知温度T,求CU50型热电阻电阻值(单位:Ω) T2R_CU100(T) 已知温度T,求CU100型热电阻电阻值(单位:Ω) T2R_PT10(R) 已知电阻R,求PT10型热电阻温度(单位:℃) T2R_PT100(R) 已知电阻R,求PT100型热电阻温度(单位:℃) T2R_PT1000(R) 已知电阻R,求PT1000型热电阻温度(单位:℃) T2R_CU50(R) 已知电阻R,求CU50型热电阻温度(单位:℃) T2R_CU100(R) 已知电阻R,求CU100型热电阻温度(单位:℃) 【四 补充说明】 1 计算按钮快捷键为 ALT+ENTER ,在无变量情况下便于全键盘操作 2 计算结果 出现"INF"表示溢出 出现"Invalid" 表示无意义结果 出现"公式错误" 请检查您的公式 3 关于优先级 扩展数学运算符,三角函数,负号>逻辑非>乘方 >数学运算符>关系运算符>逻辑运算符...... 如碰到不确定优先级的情况下,请用括号码()来确保优先顺序。 4 数值格式 如需输入二进制,请以0b开头,中间不能有空格。举例:0b11 即为3 如需输入十六进制,请以0x开头。举例:0x11即为17 科学计数法,中间的'e'表示阶数,如12e-3为0.012,而12e3为12000 5 鼠标中键最小化到托盘,WIN+C唤醒。
ORACLE函数大全 ________________________________________ 作者:[本站编辑] 来源:[CSDN] 浏览:[ ] SQL中的单记录函数 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 -- - 赵 A 3.CONCAT 连接两个字符串; SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual; 高乾竞电话 ---------------- 010-88888888转23 4.INITCAP 返回字符串并将字符串的第一个字母变为大写; SQL> select initcap('smith') upp from dual; UPP ----- Smith 5.INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 SQL> select instr('oracle traning','ra',1,2) instring from dual; INSTRING --------- 9 6.LENGTH 返回字符串的长度; SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)) ------ ------------ ---------------- ------------ --------- -------------------- 高乾竞 3 北京市海锭区 6 9999.99 7 7.LOWER 返回字符串,并将所有的字符小写 SQL> select lower('AaBbCcDd')AaBbCcDd from dual; AABBCCDD -------- aabbccdd 8.UPPER 返回字符串,并将所有的字符大写 SQL> select upper('AaBbCcDd') upper from dual; UPPER -------- AABBCCDD 9.RPAD和LPAD(粘贴字符) RPAD 在列的右边粘贴字符 LPAD 在列的左边粘贴字符 SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual; LPAD(RPAD('GAO',1 ----------------- *******gao******* 不够字符则用*来填满 10.LTRIM和RTRIM LTRIM 删除左边出现的字符串 RTRIM 删除右边出现的字符串 SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual; LTRIM(RTRIM(' ------------- gao qian jing 11.SUBSTR(string,start,count) 取子字符串,从start开始,取count个 SQL> select substr('13088888888',3,8) from dual; SUBSTR(' -------- 08888888 12.REPLACE('string','s1','s2') string 希望被替换的字符或变量 s1 被替换的字符串 s2 要替换的字符串 SQL> select replace('he love you','he','i') from dual; REPLACE('H ---------- i love you 13.SOUNDEX 返回一个与给定的字符串读音相同的字符串 SQL> create table table1(xm varchar(8)); SQL> insert into table1 values('weather'); SQL> insert into table1 values('wether'); SQL>
因各个项目中需要使用根据字符串计算数值,这里写出一个算法,专门计算字符串。配有大量常用公式。只有一个人方法,直接调用即可。 类名:CustomMath 函数名:Calculations(string value) 说明:求解算式表达式字符串的值 表达式中包含的符号或函数: truncate, ceiling,floor,round,log10, sign,sinh,sqrt, asin,atan,cosh, tanh, sin,cos,tan ,abs,acos, exp,log,max,min,pow,mod,+,-,*,/,',',(,) 函数说明:(不区分大小写) truncate(num) 计算指定数的整数部分 truncate(1.23)=1 ceiling (num) 返回大于或等于指定的双精度浮点数的最小整数值 ceiling(1.23)=2 floor(num) 返回小于或等于指定双精度浮点数的最大整数 floor(1.23)=1 round(num) 将双精度浮点值舍入为最接近的整数值 round(1.23)=1 round(num,num1) 将小数值按指定的小数位数舍入 round(1.23,1)=1.2 log10(num) 返回指定数字以 10 为底的对数 log10(10)=1 sign(num) 返回表示数字符号的值 sign(1.23)=1 sinh(num) 返回指定角度的双曲正弦值 sinh(1.23)=1.5644 sqrt(num) 返回指定数字的平方根 sqrt(9)=3 sqrt(num,num1) 返回指定数字的num1根 sqrt(27,3)=3 asin(num) 返回正弦值为指定数字的角度 asin(0.5)=PI/6 atan(num) 返回正切值为指定数字的角度 atan(1)=45 cosh(num) 返回指定角度的双曲余弦值 cosh(1.23)=1.8567 tanh(num) 返回指定角度的双曲正切值 tanh(1.23)=0.8425 sin(num) 返回指定角度的正弦值 sin(PI/6)=0.5 cos(num) 返回指定角度的余弦值 sin(PI/3)=0.5 tan(num) 返回指定角度的余切值 sin(PI/4)=1 abs(num) 返回数字的绝对值 abs(-12)=12 acos(num) 返回余弦值为指定数字的角度 acos(0.5)=PI/3 exp(num) 返回 e 的指定次幂 exp(1)=2.718 log(num) 返回指定数字的自然对数(底为 e) log(e)=1 log(num,num1) 返回指定数字在使用指定底时的对数 log(e,e)=1 max(num,um1) 返回最大值 max(1,2)=2 min(num,num1) 返回最小值 min(1,2)=1 pow(num,num1) 返回指定数字的指定次幂 pow(2,2)=4 mod(num,num1) 返回余数 mod(3,2)=1 常量: PI 值:3.14159265358979323846 E 值:2.7182818284590452354 YEAR 值:当前年份 MONTH 值:当前月份 DAY 值: 当前日 HOUR 值:当前时 MINUTE 值:当前分 SECOND 值:当前秒 RANDOM 值:一个随机数(0-1 之间) 实例 系统计算:1+2*3/4-0.5=2 函数计算:1+2*3/4-0.5=2 调用方式:CustomMath.Calculations("1+2*3/4-0.5") 系统计算:(1+2)*3/4-0.5=1.75 函数计算:(1+2)*3/4-0.5=1.75 调用方式:CustomMath.Calculations("(1+2)*3/4-0.5") 系统计算:(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6=1.20185042515466 公式计算:(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6=1.20185042515466 调用方式:CustomMath.Calculations("(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6") 系统计算:sin(pow(3,2)/4)+3.5-9*sqrt(81)=-76.7219268031121 函数计算:sin(pow(3,2)/4)+3.5-9*sqrt(81)=-76.7219268031121 调用方式:CustomMath.Calculations("sin(pow(3,2)/4)+3.5-9*sqrt(81)")

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值