3443. K 次修改后的最大曼哈顿距离
思路:每移动一步,最大曼哈顿距离最多增加1。而修改某一步的方向,那么曼哈顿的距离最多可以增加2。细节看注释,时间复杂度0(n)。
C++版本:
class Solution {
public:
int maxDistance(string s, int k) {
//维护最大值
int mx=INT_MIN/2;
// 在x,y方向上的位置
int x=0,y=0;
for(int i=0;i<s.size();i++){
char c=s[i];
if(c=='N') y++;
else if(c=='S') y--;
else if(c=='E') x++;
else x--;
// 此时的最大曼哈顿距离为 i+1 和abs(x)+abs(y)+2*k 里的最小值
// 2*k:因为改变k次方向,最多可以增加2*k
mx=max(mx,min(i+1,abs(x)+abs(y)+2*k));
}
return mx;
}
};
JAVA版本:
class Solution {
public int maxDistance(String s, int k) {
int mx=Integer.MIN_VALUE/2;
int x=0,y=0;
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c=='N') y++;
else if(c=='S') y--;
else if(c=='E') x++;
else x--;
mx=Math.max(mx,Math.min(i+1,Math.abs(x)+Math.abs(y)+2*k));
}
return mx;
}
}
Go版本:
func maxDistance(s string, k int) int {
mx,x,y:=0,0,0
for i,c:=range s {
switch c {
case 'N':y++
case 'S':y--
case 'E':x++
case 'W': x--
}
mx=max(mx,min(i+1,abs(x)+abs(y)+2*k))
}
return mx
}
func abs(x int) int {
if x<0 {
return -x
}
return x
}