找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] LeetCode Weekly Contest 250解题报告

上岸算法 回复:0 | 查看:2776 | 发表于 2021-7-19 18:02:58 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
关注我们:杭州上岸算法网络科技有限公司
3 s$ G$ c3 v+ Y* C% ~" D3 V【 NO.1 可以输入的最大单词数】' l1 _8 Z: h" w+ t! r
3 I  X/ Y4 c  E9 `3 R0 v% M
解题思路2 D& D, b& P, O% v8 U& _: r* Y- W
签到题,循环遍历判断即可。
+ V$ z: A6 ?) E7 `! w6 m
/ C. z3 x& I$ ^代码展示
3 [! X6 N0 d) C/ d. X* z9 u2 @" s. f7 ?: Z* v
class Solution {
1 Z) Q5 O) l$ L- Q    public int canBeTypedWords(String text, String brokenLetters) {5 T: W& p( ?1 C: \
        if (text == null || text.length() == 0) {& f% t4 Y/ `+ M4 `  k
             return 0;
6 Y! i& F, |$ R        }
5 I- p! t( R2 I2 l% a! X        String[] texts = text.split(" ");6 e. U: J: j  S! D
        Set<Character> set = new HashSet<>();
, ]2 d! K% y$ R0 m+ K        for (char c : brokenLetters.toCharArray()) {1 b8 [: N; P/ [, Z7 O8 t
            set.add(c);2 d$ ~: v  }4 k! {
        }
& t9 j5 u& I8 r7 C9 l" Z8 v/ x        int ans = 0, flag = 0;
6 s, u' a- U) J# |        for (String word : texts) {
1 [* P: z9 L# v9 p  u            for (char c : word.toCharArray()) {; Q) ~0 @8 C2 k+ _+ a8 i5 Z
                if (set.contains(c)) {
- ~+ A  G8 l3 L% [$ L/ d                    flag = 1;% z! T3 I( c4 h) V4 C6 h) \" i1 {
                    break;% o8 Y, V8 Z) @% `  a
                }
# T& v6 ^+ o* g6 m9 j; X* `            }
, p& e* T% f5 C6 |4 f; _            if (flag == 0) {+ [" |0 w1 c# R
                ans++;  M# _* Q% z+ \4 E' ~7 d( X
            }* g# q- y7 M& L; @; w
            flag = 0;
8 }# g- Q: q" U1 P            # m1 |5 x1 _) n4 g* w. w
        }
' u6 z; k  ^5 E" s" @. N        return ans;/ x1 f+ y" i: C# k7 N: w2 ]+ Q
    }& `- @' S3 v5 N: s$ ^4 H
}$ U) f  ^# }5 s2 ~' F5 o
( y4 n% \0 N% w' m
【 NO.2 新增的最少台阶数】
- m8 ?0 \. b- C- o  F: z
/ A; `1 \* G) a& o& N% W解题思路
; t+ w: W2 z2 O8 a; z# g第二道签到题,两两计算差值,需要判断一下是否可以整除。
9 k" p) S/ t! @* V, q" m) ^9 \& P
代码展示0 r3 |1 Y6 \; k8 R

8 Q! U4 j' g( Bclass Solution {, L9 O& H. X4 o; ]) P2 m
    public int addRungs(int[] rungs, int dist) {' Y- M9 t8 w5 l+ `* I
        if (rungs == null || rungs.length == 0) {9 B6 n3 R8 y9 S5 u7 U( ]
            return 0;$ D+ o% Q: A* v! ?, U
        }
: S/ F6 B; C. }+ S! a        int ans = 0;
" p0 e7 d# f2 p- a+ w& g        int preRun = 0;3 W  ]) P% {/ U) Q
        for (int rung : rungs) {  X. i; M( d; ?# R
            int diff = rung - preRun;& V0 I' J& k4 P0 H4 b" r
            // 整除的情况可梯子少一个' N7 P$ n6 ]  A2 S+ R. D" ~( ^# e
            if (diff % dist == 0) {1 {& L+ j$ l, N8 u! @
                ans += diff / dist - 1;
; t. p% G9 T) Q2 h            }& H- Q; J+ j3 r8 f2 O5 `
            else {
, G$ a$ C6 }, @2 Q6 o& T                ans += diff / dist;% k: a' ?9 s% m7 s  W8 P: q
            }9 ~6 g( q9 i! ]4 L) `
            preRun = rung;
1 ~7 Z: N7 x. T* ^9 r        }, @- @/ N9 B3 H3 p: Q
        return ans;$ w  u# n+ A$ ~
    }- `6 _6 W/ I! R6 T1 |$ R
}+ k, ^. O7 ^; h' J& n0 j+ c
( x4 K% U6 @! [0 P/ O, V0 z, ~

* J+ L. V1 R" R* i0 ]# q+ X% ~) h8 V【 NO.3 扣分后的最大得分】0 q1 ^( z* J4 g6 G* L3 `' a
% N+ R# g7 H6 P+ ?% V
解题思路
" Q+ B  P0 W) n8 u" B) X坐标型动态规划
. O. f: k8 Y) j0 I+ |& ?% |" H) G+ r; \5 ]$ ]# p
dp[i][j]表示处于坐标 i j 的位置的最大收益
  v6 t; @. [6 Y, \( w
' D( }3 v# C3 ]" a7 r普通的坐标转化会超时
" m! Q; [2 ?+ e: G, V, {9 v) H4 E0 p' n5 m: W
考虑针对每一个j,会从 j的左侧和右侧转移过来,我们只想要一个收益最大的
+ s5 m: }) a3 e- j+ _$ R
) @+ I: k+ x0 ^: ]- N因此在遍历 j 的时候记录这个左侧和右侧最大的收益,给下一层用0 j9 i; o9 B& N& e' U/ H* }* D

$ \* R/ O+ C! d! i0 v还有优化的空间,i 可以压缩成两行
' x6 b5 T6 G( W" M4 D
$ z. a& ^) }# F2 x代码展示. ~/ a7 g- v+ \) p: r$ a* {

. p! n6 g* ^) D, i1 Xclass Solution {7 d) B; |) H* l, `- {
    public long maxPoints(int[][] points) {) J8 l  ^( p' F. y
        if (points == null || points.length == 0 || points[0].length == 0) {
6 k4 |5 d. \/ f            return 0;$ ^% b$ W) T6 q7 X4 {
        }' v, k6 p( A3 e
        int n = points.length;
( \' w& w& ^0 g        int m = points[0].length;
$ b, l5 E: v  B        long[][] dp = new long[n][m];  \1 C. v! O/ Y% Q. k
        // 首行初始化
7 X; y; q6 W4 p: V/ K        for (int j = 0; j < m; j++) {) S, p# B& h  w
            dp[0][j] = points[0][j];
+ `# N# r  @  W4 y6 ~        }
# H. Q+ {6 |6 @+ c" N- `, a; y        for (int i = 1; i < n; i++) {, q( p, e2 J, \, A9 W
            // 对于所有上一行左边的数,都是加上它的坐标减去自己的坐标;
' D- K4 J$ d" y+ S, G! [, p            // 对于上一行所有右边的数,都是减去它的坐标加上自己的坐标;4 o+ o! @! X2 }- s: l
            long leftMax = Integer.MIN_VALUE;
% k8 c8 ]- u( k% X/ I& `7 X% W            long rightMax = Integer.MIN_VALUE;
& i1 G4 G6 i4 I# |- G9 y            for (int j = 0; j < m; j++) {0 u. W, q1 W% O* @' e
                leftMax = Math.max(leftMax, dp[i - 1][j] + j);
8 E% |0 U0 k* ]& G                rightMax = Math.max(rightMax, dp[i - 1][m - 1 - j] - (m - 1 - j));" L9 @2 ~& w& ]9 y2 ~
                dp[i][j] = Math.max(dp[i][j], points[i][j] + leftMax - j);
- [( Y4 [4 }2 l' H                dp[i][m - 1 - j] = Math.max(dp[i][m - 1 - j], points[i][m - 1 - j] + rightMax + m - 1 - j);7 M3 i7 o2 ~, o( P- P4 y8 q
            }
" Z* A$ I+ E0 d        }
* h; U) K# Z* \! B' Z6 o& a' S( O        long ans = 0;
6 f  A( K; g! r, Q; X        for (int j = 0; j < m; j++) {# c2 z  g5 g  ]2 O3 y* _2 `
            ans = Math.max(ans, dp[n - 1][j]);2 b# G  C0 \. V8 g& U2 x( ^
        }6 p* Y2 R9 l# m6 J+ R' b
        return ans;7 {" h9 q9 I1 d8 l
    }5 M" e* ?, [0 U- ]# o) S* p
}
3 Q* f+ m' v& a" v: }* L. v, ?
* R5 b  J+ \/ ^8 Y$ q. V
8 K6 H& h; Q, q* c( l+ T7 M【 NO.4 查询最大基因差】0 H* ?) B8 o, p3 }- X0 e

4 B, W+ S1 W+ W% _; K  ]5 G1 A; `9 J解题思路$ x, D. G2 X8 r+ Z$ j
二进制的字典树:将数字转化成二进制记录在字典树当中3 s+ @; N2 L; h3 I/ _
5 w. D/ t2 L, I
构建树,方便做DFS' W$ b  P# c" \4 L0 V7 \+ d9 Y8 n

7 T6 A3 K! e% T1 @每搜索一个数字,将该数字更新到字典树当中
2 Y, q2 O5 }- c- T* w; X% l5 D9 N5 [  y/ b, t
在字典树上计算最终最大的异或值
6 \5 K# x# y. S" a! D, V6 X" }$ o
代码展示
) Z$ ~- y$ {3 n2 L+ t. g# J9 T
5 T* C. M& K/ i, j* t+ rclass Trie {. [1 J4 W. V8 @2 U6 a
    Trie left;      // 1# P, {$ W* |: t: C4 Z0 ~! f5 z* e
    Trie right;     // 05 B7 \# p2 E+ {
    int[] count = new int[2];
0 W/ T8 K( @/ M) a" e    public Trie() {}! M  @/ z9 I1 f5 R
# i& J+ S0 U7 v( m$ K) z4 U* i
    // s == 1 添加, s == -1 删除
" ~4 m1 i2 u! S  f2 P    public void insert(int val, int s) {
1 L+ T' S2 x: I0 r8 C        int flag = (1 << 30);
2 A/ C' c  a! O; L6 `        Trie node = this;6 p0 a; B1 a. M" u" k; y; _4 J/ e
        while (flag > 0) {
$ a. M' X1 g0 K            int bit = (flag & val);. L; e5 Z( T' Z  y, c; c
            if (bit > 0) {6 R( i$ o) V3 P% z3 f3 T( @
                // 1 走左边" ^( Z7 U0 }, }: ~+ \0 l
                if (node.left == null) {+ S' ?9 K7 ?6 W6 `0 G- W
                    node.left = new Trie();5 w# v: J/ {' E0 [/ ^8 w0 N* x& P
                }
# y) A- Q% ]) a$ {% r                node.count[1] += s;
) K7 I4 {8 y' @" Q, t                node = node.left;
& m( Y- _0 U& W# T) }3 r            } else {
$ y5 T& a! D6 X9 O) p                // 0 走右边5 x  u" r+ J, k! y( {3 d$ ?7 t% Z
                if (node.right == null) {
5 V7 ]- ?8 G8 h( Z  h/ `5 u                    node.right = new Trie();" s9 r; V! ]. X7 T7 O* m: j
                }
0 N7 m' [, y/ B, [+ q. Z1 g                node.count[0] += s;+ m  b. {2 Q2 P) K1 v$ N' i: i
                node = node.right;' O8 o. s5 q5 K
            }
3 J4 @% ~0 o( E! L9 Q4 [            flag >>>= 1;* x( {* b( E4 L3 h& ?- e$ V" r  G
        }+ y3 E# ~* k8 @8 X
    }
% J* i0 U; k$ q( i) F' s  d2 |
* ]# z6 y( X7 z    public int getMax(int val) {2 ^+ W2 k& k# |: @, b8 w( _
        Trie node = this;5 q" X- _$ e( T: r0 N4 F# f
        int flag = (1 << 30);
7 O. B: q: Q, i/ I9 |( P        int res = 0;% H$ P" K9 n$ @5 p: x
        while (flag > 0) {  B5 ^4 N: }8 `0 Q+ }* L1 X+ D
            int bit = (flag & val);
: ^6 |) ~1 }4 `0 L8 H! U            // 贪心算法,1 的话走右边,0 的话走左边
4 _. H2 y* l! B0 G            if (bit > 0) {3 u# u8 }6 j. k8 s# I* k
                // 走右边,右边不行走左边
) ]) G, C  K0 a9 \, t( r                if (node.right != null && node.count[0] > 0 ) {
0 f( R$ G% o+ g% }3 r' w3 k" R                    node = node.right;/ A3 y# a$ F  A! [
                    res |= flag;
) L1 ]! v1 P2 t, M0 W6 c4 U                } else if (node.left != null && node.count[1] > 0) {' Q5 M% C5 l! Y" e
                    node = node.left;
- D6 ^. _2 z* v/ K- ~' \                } else {# z8 q7 k4 `* m6 U
                    return -1;" y; O- M) M) k* K# h; }  _% u' x' g
                }
  O7 }) |# u  D+ f( n/ R            } else {
9 \* }5 i1 X+ P# d$ O                // 优先走左边
" F6 Y" V* z: z8 v0 X- P1 L                if (node.left != null && node.count[1] > 0) {; Z- c( [, D0 T9 ^2 d) t
                    node = node.left;& M. i; R- o' J
                    res |= flag;  I8 G3 d& \3 ~0 o0 a
                } else if (node.right != null && node.count[0] > 0) {) g' _7 T$ A% z3 Y, @7 P5 f
                    node = node.right;
! o. G' e5 G4 f* F3 B4 i                } else {
5 [0 ?! P+ R2 c# V( A' A& Y                    return -1;2 u; o9 }& K* R- H
                }- |- P4 X! l: ~3 s+ N
            }! G! |# x/ i9 d0 ^- a
            flag >>>= 1;( a7 X# a; y" }" f* P& i
        }
0 m6 T+ p: j3 \' h% s2 U+ x        return res;
4 ?9 p8 W1 t1 d7 u' c- x1 W    }
; p' g! X3 v/ I  f, S% Z}
/ x/ H, L: p6 gpublic class Solution2 {# `: o* k  c$ L; h  B$ h; y) b" [
    static class TreeNode {: Q+ J" P) H8 Z6 Y$ H! |6 {
        List<TreeNode> son = new ArrayList<>();: n" x2 U# C4 c! a3 ~7 ~+ S
        int val;/ X% T2 R- n* q- P
        public TreeNode(int val) {
, ~7 E3 T! }1 k            this.val = val;; d, k/ o$ u! A5 ]0 [5 R- I
        }7 v+ V: O7 N, A, R1 ]& \
    }4 t  u) B! K/ A1 j7 e
    Map<Integer, List<int[]>> map = new HashMap<>();7 I; k7 l1 u3 O* h
    Trie trie;1 d7 \: V: R& j3 _3 w
    public int[] maxGeneticDifference(int[] parents, int[][] queries) {% Q% O9 S9 x4 O8 i
        int n = parents.length, m = queries.length;
9 K* ?% _+ o9 D5 h5 o        // 封装查询的信息" ?, Z; n9 v0 c0 V- Y; V
        for (int i = 0; i < m; i++) {
& v7 _! W+ }1 W4 g( l7 G            int node = queries[i][0], val = queries[i][1];/ A2 |$ L8 _1 d; `4 _
            if (!map.containsKey(node)) {" _) J; K! x, g! B
                map.put(node, new ArrayList<>());# u/ A# [) R9 t% `8 t0 W
            }7 \4 J  {9 U3 j" C: C$ ]3 T
            map.get(node).add(new int[]{val, i});
6 Q1 ]! N! \1 W4 a0 n: |* p        }
3 l7 i- L* k, I( }8 W        Map<Integer, TreeNode> nodeMap = new HashMap<>();& \% f7 Y3 V# R3 L
        // 构建树
5 Z$ w2 N* O( b" \! U        TreeNode root = null;/ V% w+ c: d( p5 Y  g& w; n: o
        for (int i = 0; i < parents.length; i++) {8 }3 e3 M8 ^4 T+ h0 I
            int p = parents[i];7 a7 N$ n4 T( h! o" D" U6 O) x- O
            if (!nodeMap.containsKey(i)) {
  H( |7 }9 t: \& {8 V* W( ~  _  j                nodeMap.put(i, new TreeNode(i));$ S' j4 Z. b1 Q- H. ~9 g$ _
            }
6 N& ]* r9 E! D: k% _3 m0 A            if (p != -1) {2 P# {4 y  j! F% y1 Y
                if (!nodeMap.containsKey(p)) {3 o: W6 f( A; K3 c* d
                    nodeMap.put(p, new TreeNode(p));% o: S( U# ~6 @
                }3 {6 L( [" c. c, _% t9 c& D" p
                nodeMap.get(p).son.add(nodeMap.get(i));/ W" h7 ~6 F: L4 R. H9 _
            } else {
# |8 N: Y; |9 y0 h% e) X                root = nodeMap.get(i);
! ]( h  _' O0 ?" Z            }# J% H3 B3 J: m; Y' k  J  c
        }% E& G6 x/ g& J* u! \
        trie = new Trie();3 r3 j; X' h( V) K  k5 Q8 ^5 }
        int[] res = new int[m];
( x6 Y. ]# K- H4 C% e9 ~+ e        // 在树上进行DFS5 }6 g$ C- J3 m9 c: W/ o$ _. `
        dfs(root, res, map, trie);% ]% v( ]+ O  i
        return res;+ y$ Z  w8 c" I. X% N( R

2 o( N- m" `4 a* B& i    }" k4 ]4 E8 M8 n9 Q; o

7 S9 o+ K+ i! J) M$ A$ ^5 ?- B    private void dfs(TreeNode root, int[] res, Map<Integer, List<int[]>> map, Trie t) {
' a% ?* U# O7 j8 ?0 m        if (root == null) {) P) U$ B$ v3 S6 f6 X, E9 Y
            return;
  G% W$ X6 ]0 q5 Q* w- |        }; P& z5 |9 M- W' M
        t.insert(root.val, 1);
9 p& M) L; j4 r" v6 D' s# p        if (map.containsKey(root.val)) {9 O8 [5 U: W4 t. g6 I% N
            for (int[] each : map.get(root.val)) {
( c6 k; [  C: O) Z                int idx = each[1], v = each[0];
) B4 w" J$ m* E                res[idx] = t.getMax(v);! A- n% T) J" b3 n! p# m
            }
/ C+ K5 M6 U0 n! f: a+ n. m( P4 Z        }
: o$ |% i! ]5 t9 H3 P8 a9 V        for (TreeNode s : root.son) {9 B; v1 K  W4 _, A
            dfs(s, res, map, t);* m( P# X3 H7 Z* r" {! Z! a
        }
1 o7 Y/ U& d4 [. J/ j- z        // delete
' Z# r" K9 D' {& i0 w$ ~        t.insert(root.val, -1);- N( P: Z/ C% m! W4 R
    }3 e7 e. a+ A7 s2 ?! G& u! H! H! R" \+ v
}3 Z; A& n: ?& p6 d; P+ P

5 L' t3 N7 N; L, a  `" S+ H, c, S2 Q) S# }$ g( U5 _4 f2 d+ {# z
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表