(LeetCode 每日一题) 3443. K 次修改后的最大曼哈顿距离 (数学)

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值