原题
1499.满足不等式的最大值
2020年6月28日 195周赛第四题
题解
方法一
暴力遍历所有数对。此方法超时。
java代码:
/*暴力法
63 / 65 个通过测试用例 状态:超出时间限制
2020.06.29 18:28
*/
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
int ans=Integer.MIN_VALUE;
for(int i=0;i<points.length;i++){
for(int j=i+1;j<points.length;j++){
if(points[j][0]-points[i][0]<=k){
ans=Math.max(ans,points[j][0]-points[i][0]+points[i][1]+points[j][1]);
}
else{
break;
}
}
}
return ans;
}
}
方法二
本方法代码java示例:
/*
@v7fgg 有参考
执行用时:5 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:102.8 MB, 在所有 Java 提交中击败了100.00%的用户
2020年6月29日 21:09
*/
class Solution {
public int findMaxValueOfEquation(int[][] points, int k) {
int ans=Integer.MIN_VALUE;
int i=0;
int j=1;
int da=points[i][1]-points[i][0];
while(j<points.length){
if(points[j][0]-points[i][0]>k){//以下都括在if内,是因为不符合条件时,
//j发生变化也会更新da到最接近j的那个差
while(i<j&&points[j][0]-points[i][0]>k){
i++;//i和j不够近的时候i要靠近j,终止条件是ij相等或足够近
}
da=points[i][1]-points[i][0];
//先存下da,这也是对于后边点的小限
if(i==j){//如果靠的都一样了才够近,j就要后移了,保证ij不等
j++;
continue;
}
int linshi=i+1;
while(linshi<j){
if(da<=points[linshi][1]-points[linshi][0]){
da=points[linshi][1]-points[linshi][0];
i=linshi;
//先判断符合大于条件,并且更新da,再把i赋值回去
}
linshi++;
}
}
ans=Math.max(ans,points[j][1]+points[j][0]+da);
//由于下一步就要j自加1了,因此此时的j也要加入比较
//每次j自加变化之前都要进行如下if操作
if(da<=points[j][1]-points[j][0]){
da=points[j][1]-points[j][0];
i=j;
}
j++;
}
return ans;
}
}