登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
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
|