leetcode 3443. K 次修改后的最大曼哈顿距离 中等

给你一个由字符 'N''S''E' 和 'W' 组成的字符串 s,其中 s[i] 表示在无限网格中的移动操作:

  • 'N':向北移动 1 个单位。
  • 'S':向南移动 1 个单位。
  • 'E':向东移动 1 个单位。
  • 'W':向西移动 1 个单位。

初始时,你位于原点 (0, 0)。你 最多 可以修改 k 个字符为任意四个方向之一。

请找出在 按顺序 执行所有移动操作过程中的 任意时刻 ,所能达到的离原点的 最大曼哈顿距离 

曼哈顿距离 定义为两个坐标点 (xi, yi) 和 (xj, yj) 的横向距离绝对值与纵向距离绝对值之和,即 |xi - xj| + |yi - yj|

示例 1:

输入:s = "NWSE", k = 1

输出:3

解释:

将 s[2] 从 'S' 改为 'N' ,字符串 s 变为 "NWNE" 。

移动操作 位置 (x, y) 曼哈顿距离 最大值
s[0] == 'N' (0, 1) 0 + 1 = 1 1
s[1] == 'W' (-1, 1) 1 + 1 = 2 2
s[2] == 'N' (-1, 2) 1 + 2 = 3 3
s[3] == 'E' (0, 2) 0 + 2 = 2 3

执行移动操作过程中,距离原点的最大曼哈顿距离是 3 。

示例 2:

输入:s = "NSWWEW", k = 3

输出:6

解释:

将 s[1] 从 'S' 改为 'N' ,将 s[4] 从 'E' 改为 'W' 。字符串 s 变为 "NNWWWW" 。

执行移动操作过程中,距离原点的最大曼哈顿距离是 6 。

提示:

  • 1 <= s.length <= 10^5
  • 0 <= k <= s.length
  • s 仅由 'N''S''E' 和 'W' 。

分析:记一段路程中走过的东南西北总数分别为 e, s, w, n,不妨令 e>=w, s>=n,不难发现终点与原点的曼哈顿距离与具体的路径无关,直接等于 (e+s)-(w+n) ,显然,要使变更 k 位后得到的曼哈顿距离最大,只需要把 w 或 n 变为 e 与 s 即可,考虑到wn的总数限制,终点处的最大曼哈顿距离为 (e+s)-(w+n)+2*min(k,w+n),在遍历的同时更新最大值,即为全程的最大距离。

int maxDistance(char* ss, int k) {
    int n,s,e,w,ans=0;n=s=e=w=0;
    for(int i=0;ss[i];++i)
    {
        if(ss[i]=='N')n++;
        else if(ss[i]=='S')s++;
        else if(ss[i]=='E')e++;
        else if(ss[i]=='W')w++;
        ans=fmax(ans,fmax(n,s)-fmin(n,s)+fmax(e,w)-fmin(e,w)+2*fmin(k,fmin(n,s)+fmin(e,w)));
    }
    
    return ans;
}

你可能感兴趣的:(模拟,leetcode,leetcode)