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

[吹水聊天] 上岸算法LeetCode Weekly Contest 266解题报告

上岸算法 回复:0 | 查看:3322 | 发表于 2021-11-7 19:34:23 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 统计字符串中的元音子字符串】
0 t! _3 b, e: R& q; T; T解题思路" `6 ^% }) L  D7 i3 m
签到题。3 @$ w7 I; J9 s: L

4 m6 G$ _! Y/ S8 k+ W- R代码展示: t$ F# |2 ]* O3 A% X# m) _

7 m( w! C$ K; aclass Solution {, }& N3 o6 A' u& H3 X0 {3 Z# x" ~
   public int countVowelSubstrings(String word) {
" K! K+ W' E2 ^3 P. T# T% Y       int count = 0;
9 Q6 K& @  [# o; a       for (int i = 0; i < word.length(); i++) {
4 P& C7 h( v, s           for (int j = i + 1; j <= word.length(); j++) {0 C' [7 D8 Q6 V6 Z* I8 c
               count += containsAll(word.substring(i, j));6 r& t! w+ b; U% p5 v
          }9 Q' f8 ]0 E" A3 W2 \
      }
) P1 e; \; Y" g       return count;
6 a6 e' \0 u0 f  q* ?  }
" H. H0 V: R5 f, [" s$ G& t: N+ l0 J" k' J9 i+ K4 A# C) g7 K/ _
   private int containsAll(String s) {
( l3 C: R( C2 i/ X       if (s.contains("a") && s.contains("e") && s.contains("i") && s.contains("o") && s.contains("u")) {& g/ x+ y+ S* J) w" k% O
           for (var c : s.toCharArray()) {
- R; t# J( U3 K7 U3 Z# ]. g# g! c# f               if (!"aeiou".contains(String.valueOf(c))) {
( B: _* m! I' @9 {& [6 N                   return 0;3 G% r/ x, Q3 E) r1 B6 ~
              }
- |; i1 l( p6 \0 }2 k          }( k; \' B: g& t' t& d
           return 1;5 c/ l' i+ a& G- ?' ^
      }
; W! }  ^; ?* `, s) \       return 0;
9 P' c! S8 z( }4 r% ~& g/ ]0 C  }
" n2 W5 e$ w/ N6 n8 M7 ]( q  f) v$ f}
5 P  O: Q% a  Z3 H
; \! Z5 D( M+ W8 [* ^【 NO.2 所有子字符串中的元音】9 k' _$ r3 S, _: K7 `
解题思路
1 ~, W6 `# D% I5 y依次计算每个位置的元音字符会被多少个子串计数即可。
7 k! K' ]4 t( r4 f9 ^8 f" ~5 o! X- O% ^8 i" {9 g( s5 P
代码展示
: T3 g/ ^' V3 P1 f; I* F+ L- A- H5 i, x  V
class Solution {( }* i" g5 d! |& }4 l* p7 C3 G
   public long countVowels(String word) {
! ?4 _. I# y. g) H% n/ p6 L       long result = 0;
5 ^) d9 l$ C# w5 d: S; V       for (int i = 0; i < word.length(); i++) {: Y' s# o% o8 R# Y# c: k2 S
           if (!"aeiou".contains(String.valueOf(word.charAt(i)))) {
2 j# K1 [3 F6 c5 }2 h6 M& v               continue;
) A8 K/ f$ [& D          }( I7 k* P$ I5 z( ~
           long left = i;
, i( b( v( i7 N) f) Z: K( V           long right = word.length() - i - 1;
5 H* G$ n) a* i" G0 s2 s           result += left * right + left + right + 1;
- U3 g! J# A4 G3 c8 Y      }
7 h# E$ g% g2 n( @% C' r- k       return result;3 u( N0 q, G% h5 w; I1 ]2 d& i7 x
  }/ M% I0 `, P" Y% _+ z# Z, j
}
* X: q6 k- U! g. {7 `  Z( S9 s( l- n3 l1 W# ^. E
【 NO.3 分配给商店的最多商品的最小值】
9 Z8 \( _0 U: }2 @) `8 h( u解题思路
& t. [+ R1 v3 i) _二分答案,假定一个商店最多能分配 x 个商品,那么我们可以轻易计算出需要多少个商店,即可得到 n 个商店能否分配完这 m 种商品。
' }- S4 Q4 `7 y6 }* p
% \. j9 W3 [" B( R代码展示
5 J: h$ ~# s2 f, x2 \  Z
; D6 D* j+ Q8 }class Solution {
0 a& r- j' T+ U8 f# j; s   public int minimizedMaximum(int n, int[] quantities) {
; K7 W" y& Y5 p* ^& J% R7 }       int left = 1;
* n, C8 E# _; q+ H" Z       int right = Arrays.stream(quantities).max().getAsInt();4 |6 ~8 t1 i( d
       while (left + 1 < right) {
  V2 N' w2 _5 _           int mid = (left + right) / 2;
; z6 U% Q6 z: B4 j- R3 e           if (check(n, quantities, mid)) {
4 c; |  L) \. H4 A5 R               right = mid;
( [$ s# L4 H7 C* Z" v3 v          } else {) D- k0 r* F  D: a4 X: d
               left = mid;
4 s& s/ I3 J0 R- p" j% a3 g/ ?          }
% {# X! x6 k* G      }
. K  k5 P8 R' B; s  Y' M       return check(n, quantities, left) ? left : right;
) n2 y7 w" z4 H2 n6 d9 Q& a  }$ e5 R) F6 P7 m8 A( q3 G* S, J2 u
& ]# I) ?3 o; `) E& _# M2 S, y
   private boolean check(int n, int[] quantities, int x) {2 Y# d4 h4 K8 x+ O4 `3 K
       int cnt = 0;
" @' k- b1 y  U/ N! B6 H9 R       for (int q : quantities) {7 {& O3 }. p$ D1 a' Z8 c
           cnt += (q + x - 1) / x;; B  L+ H" i8 ?2 P( I4 R1 j
      }
% g3 ^' a% F" M- F- U' V7 V9 T       return cnt <= n;
( q2 R, c) z8 j3 c  }
0 B% f, \4 a& ^' P# H: Y8 t: E5 R}# p: V  b8 h$ x# @  A* u6 G

1 x! a" y+ n# ^【 NO.4 最大化一张图中的路径价值】" c3 U& o7 ]) H
解题思路4 a! C# H& B& P0 [7 y
看似复杂,但是观察数据范围,发现直接回溯即可。5 y6 x  Y9 |' A5 ]7 y
5 K. K! v, J/ m6 x3 j& a6 Z% s
代码展示
# q- u: ?4 q; A: J
# `) x% H4 U( s2 c' [+ Sclass Solution {
$ s" H& E) @/ u1 Q3 _3 F, Y   int result;
2 F" @) Q* h3 W) f   List<Integer> empty = new ArrayList<>();7 d* @$ n3 H1 _4 D. W! a
' p. [  H. l( F2 p2 i* F
   public int maximalPathQuality(int[] values, int[][] edges, int maxTime) {+ U5 ~1 l; |4 [6 c4 h$ q, I6 X
       Map<Integer, List<Integer>> children = new HashMap<>();
$ R/ R9 U: M8 X       Map<Integer, Map<Integer, Integer>> times = new HashMap<>();* E3 K6 o+ i6 S4 }: v
       for (int[] e : edges) {
) w3 P/ h, k$ ^% L# n           if (!children.containsKey(e[0])) {6 U8 [" `; r1 B+ X
               children.put(e[0], new ArrayList<>());
7 z0 H* o9 M( ~+ O3 f+ h& j& B          }
, o  I: r5 q5 r7 b4 g/ J           if (!children.containsKey(e[1])) {1 z7 u* t0 B+ M% z
               children.put(e[1], new ArrayList<>());2 Z  Q+ H: a  y" z8 F% J% X
          }
1 j) }- L1 S% R5 y9 l. U. c           if (!times.containsKey(e[0])) {
$ y# V1 ~' B# X9 N/ r# t               times.put(e[0], new HashMap<>());
) X, o. O* I" H- H          }0 E8 M; t- ~# q% E
           if (!times.containsKey(e[1])) {
, d$ {) x9 J- w               times.put(e[1], new HashMap<>());
: R& I5 Z! Z) W" f! t          }
9 S1 G! P! w+ c9 K) p7 O% M# b! U/ S           children.get(e[0]).add(e[1]);; @. K) r- \2 W% R& B& a4 w
           children.get(e[1]).add(e[0]);8 X9 {- z" x: F- ]/ n6 R' o
           times.get(e[0]).put(e[1], e[2]);
0 H% H( n' O. s" ]% @           times.get(e[1]).put(e[0], e[2]);
( J$ o; L; V7 Z- |2 s% J# A0 q+ J      }! a" S7 T7 b6 p! ~
       int[] vis = new int[values.length];) u% g/ o8 {% a. E- V0 a# N
       result = 0;; _: D* W- G2 h1 _# H2 Y5 b5 t
       dfs(0, 0, 0, maxTime, vis, values, children, times);3 n( F  m/ ~. J) e' i9 t4 }
       return result;$ H+ p% c( H' Q1 V( @
  }
& [% g6 H+ A; W2 }
7 e- a' ?! n  n% O   private void dfs(int pos, int sum, int time, int maxTime, int[] vis, int[] values, Map<Integer, List<Integer>> children, Map<Integer, Map<Integer, Integer>> times) {
6 l1 k8 p( s0 b* P( o( \5 p       if (vis[pos] == 0) {
6 f5 E% e+ ?! ]5 n           sum += values[pos];3 F% g( x: t% B  w; H
      }
. G# G) ]  Q* b       vis[pos]++;: u8 B5 Q, e6 t4 b) X
       if (pos == 0) {( _% C' `0 n% }$ s3 s+ s
           result = Math.max(result, sum);
" P# e  Y3 H( S+ n6 j      }' ~# c! T2 P! H: _9 x
       for (int nxt : children.getOrDefault(pos, empty)) {
4 }5 H: q' B8 _% x. ]           if (time + times.get(pos).get(nxt) <= maxTime) {
# @1 K7 O' V) ?# k               dfs(nxt, sum, time + times.get(pos).get(nxt), maxTime, vis, values, children, times);* T+ T3 Y$ Q* T; w1 z  w8 a8 [
          }
' a3 ], V4 a' Q      }  F2 i+ {0 V8 a& m2 y; Z0 }, A
       vis[pos]--;
$ g- i. r' Z2 G  P6 X  {6 G+ i  }
" k' |/ v; s/ }; D  {8 X6 N}; {4 u8 q) R' j* x
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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