Leetcode - 周赛435

目录

  • 一、3442. 奇偶频次间的最大差值 I
  • 二、3443. K 次修改后的最大曼哈顿距离
  • 三、3444. 使数组包含目标值倍数的最少增量
  • 四、3445. 奇偶频次间的最大差值 II

一、3442. 奇偶频次间的最大差值 I

题目链接
Leetcode - 周赛435_第1张图片
本题使用数组统计字符串 s s s 中每个字符的出现次数,然后求出现次数为奇数的最大值和出现次数为偶数的最小值,将它们相减得到答案。

代码如下:

class Solution {
   
    public int maxDifference(String s) {
   
        int[] cnt = new int[26];
        for(char c : s.toCharArray()){
   
            cnt[c-'a']++;
        }
        int mx = 0, mn = Integer.MAX_VALUE;
        for(int x : cnt){
   
            if(x % 2 == 1){
   
                mx = Math.max(mx, x);
            }else if(x > 0){
   
                mn = Math.min(mn, x);
            }
        }
        return mx - mn;
    }
}

二、3443. K 次修改后的最大曼哈顿距离

题目链接
Leetcode - 周赛435_第2张图片
曼哈顿距离求两个坐标点 ( x i , y i ) (x_i,y_i) (xi,yi) ( x j , y j ) (x_j,y_j) (xj,yj) 的横坐标距离绝对值与纵坐标距离绝对值之和,即 ∣ x i − x j ∣ + ∣ y i − y j ∣ |x_i-x_j|+|y_i-y_j| xixj+yiyj,也就是说,可以将横纵坐标分开来计算:

  • 对于 x x x 轴来说(东西方向):比如说,此时向东移动了 a a a 步,向西移动了 b b b 步, a > b a > b a>b,肯定是将向西移动转换成向东移动,才会使得它距离原点距离越远。假设转换了 d d d 次,此时距离原点的距离就变成了 a + d − ( b − d ) = a − b + 2 ∗ d a + d - (b - d) = a - b + 2 * d a+d(bd)=ab+2d,如果 a < b a < b a<b,那么就是 b − a + 2 ∗ d b-a+2*d ba+2d,所以一合并变成了 a b s ( a − b ) + 2 ∗ d abs(a-b)+2*d abs(ab)+2d,这里的 d = m i n ( a , b , k ) d=min(a,b,k) d=min(a,b,k) k = k − d k = k- d k=kd
  • 对于 y y y 轴来说(南北方向)也是同理.

代码如下:

class Solution {
   
    public int maxDistance(String s, int k) {
   
        String str = "NSWE";
        int[] f = new int[4];
        int ans = 0;
        for(char c : s.toCharArray()){
   
            f[str.indexOf(c)]++;
            int left = k - Math.min(Math.min(f[0], f[1]), k);
            int res = get(f[0], f[1], k) + get(f[2], f[3], left);
            ans = Math.max(ans, res);
        }
        return ans;
    }
    int get(int x, int y, int k){
   
        int a = Math.max(x, y);
        int b = Math.min(x, y);
        int d = Math.min(b, k);
        return a - b + 2 * d;
    }
}
//也可以换一个角度思考,设当前位置为(x,y):
//由上一种方法可知,每一次修改都会使得曼哈都距离增加 2,最多不会超过 i + 1
class Solution {
   
    public int maxDistance(String s, int k) {
   
        int ans = 0;
        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<

你可能感兴趣的:(Leetcode周赛,leetcode,算法,职场和发展)