leetcode-3443. K次修改后的最大曼哈顿距离
题目描述
示例输入
解题思路
一开始觉得需要画个图找一下灵感,因为最难的是这个k次修改,修改要改在关键的地方才能使得最大曼哈顿距离更远,所以由于一直想不到k要在哪里改才能合适,导致这个题目卡了很久。
后面把思路换了一下:
我把N,W,S,E划分成了两个阵营在对抗,N与S对抗,W与E在对抗。
这样给定一个字符串,我永远能够计算出在字符串结尾部分此时的曼哈顿距离是多少,只需要求abs(N-S) + abs(W-E)就可以了。而所谓的修改,无非是把S转化为N或者N转化为S(以纵向为例),使得优势阵营进一步扩大,最终导致曼哈顿距离的增长。而当劣势阵营已经没有值可以再转化时,如果k没有用完那就剩余的修改次数就丢掉;而如果k不够将所有的劣势阵营转化为优势方,就最多只能转换k次。
由此我们可以按题目给的s进行遍历,并充分利用k次转换,这样可以得到每一步的曼哈顿距离,如果超过记录的最大值就更新。遍历完之后的最大曼哈顿距离就是结果。
我愿意将此题称之为见风使舵!!!
代码
class Solution {
public:int maxDistance(string s, int k) {int N=0,S=0,W=0,E=0,Max_ = 0,Max_NS,Max_WE,Min_NS,Min_WE,add,tmp;for(int i = 0; i < s.size(); i++){if(s[i] == 'N') N++;else if(s[i] == 'S') S++;else if(s[i] == 'W') W++;else E++;
Max_NS = max(N,S);
Min_NS = min(N,S);
Max_WE = max(W,E);
Min_WE = min(W,E);
add = k > (Min_WE + Min_NS) ? (Min_WE + Min_NS) : k;
tmp = (Max_NS + Max_WE + 2 * add - (Min_NS + Min_WE));if(tmp > Max_) Max_ = tmp;}return Max_;}
};