找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

上岸算法 回复:0 | 查看:1603 | 发表于 2022-1-9 21:41:18 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否每一行每一列都包含全部整数】2 U" C% d6 e- x$ q! E% \3 V0 s3 N
, q& \: ~7 [- V/ T
解题思路( k8 F& r1 A2 I" _1 |9 v1 L
签到题,可以用排序做,也可以用 Set 做。# j+ H! A" h. [# S  F. u+ @! D& l

3 G7 z, z% W" Q3 D5 f2 s+ o代码展示) l) w# Q5 l" ~
2 l0 r9 R4 w  A- B) m
class Solution {" f# [9 I' k. |3 K2 c7 B2 u, n
   public boolean checkValid(int[][] matrix) {, ~' B9 T# L, q# L) f+ \( G
       for (int[] mat : matrix) {
' D0 R9 ~$ U* F. W& P% l           int[] m = Arrays.copyOf(mat, mat.length);' l6 d9 R6 ]  i) p
           Arrays.sort(m);
3 L' @' h8 Y  V2 q8 O           for (int i = 0; i < m.length; i++) {
4 G' t3 r+ I, O) k! X; W! w3 ^               if (m[i] != i + 1) {
, d! m7 l2 O( N* a+ m$ t                   return false;
+ i- M8 \" x& `1 f! I+ F# `              }; C4 ?. Q2 V2 {8 \
          }. Y- H. m/ j% G, _
      }! E  l# d; u$ l- S  ]0 g
       for (int i = 0; i < matrix.length; i++) {5 e! s( C1 m  D
           int[] m = new int[matrix.length];
' Q7 _1 H& M$ ]% p7 o) \. }" V           for (int j = 0; j < matrix.length; j++) {0 X5 }. X  s1 u$ ^. a# e3 e
               m[j] = matrix[j][i];
! I! J3 {0 q9 q$ F0 Y          }- d2 h3 z( S, g) c
           Arrays.sort(m);- i3 A; F4 Q2 k. j* ]$ e  ~$ C
           for (int j = 0; j < m.length; j++) {( O4 m5 h( b( `$ A, H
               if (m[j] != j + 1) {$ b4 W2 U4 `/ B1 V5 J6 T6 t3 r
                   return false;
6 u1 \5 ^* a: \, x0 K: l$ T) e! Q( d8 U              }
, A* V; y% M2 z3 K/ L          }% T5 u6 K0 B$ x  C: z/ b& V0 {
      }# a# |& r% }. J" h1 E
       return true;: _; C* W* P9 o+ P6 c
  }+ S  t$ |( u0 M9 b
}
3 L. }3 s. y3 Q# h' M, l- O6 f: B1 {" U
" h1 C" `6 ]7 p4 H
【 NO.2 最少交换次数来组合所有的 1 II】, T% U9 @" {; J" e
! k5 D* k* W' m0 ]( G, @4 l- B. z# L  x
解题思路
, T; U3 S0 p6 ]. t& P首先化环为链(将 nums 复制一次拼接到尾部)。
3 d/ C! x* i& J. x# O' y, V" k* `8 B4 N: o7 |$ `9 N# _
然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。- b( ?- |+ ?' K

3 {) T+ E* a& U0 \0 x  c% I每一段下标中 0 的数量可以用前缀和求出来。
* c& ~* {9 G, w) p: l- q/ V2 P' f* c# l& a) j, e4 [
代码展示
/ i1 |/ J. G4 d* O, K
* L0 w  h7 u: X1 j& G) Xclass Solution {
4 }' A. u4 M0 U4 B" H   public int minSwaps(int[] nums) {
4 p. k1 V9 ^/ q( \2 w       int[] link = new int[nums.length * 2];# g( [& \& G# U+ U% g; y
       for (int i = 0; i < nums.length; i++) {9 F1 Y# C4 a- r0 m3 g8 ~9 t0 N6 f  N
           link[i] = link[i + nums.length] = nums[i];
5 N# R# l# h7 ?' {6 F' V  G$ {      }" z% a! d  ?" l) v* H# a9 K
       int[] preSum = new int[link.length];
$ ]3 P* i1 l3 }; s  a       preSum[0] = link[0];
( m+ D6 F' Z/ @% I- l       for (int i = 1; i < link.length; i++) {
, D. V' V- ~- Y0 \. `           preSum[i] = preSum[i - 1] + link[i];
! }$ J: y, I. \# D      }( @# l& A0 H! l8 ^0 s2 W. w
       int tot = preSum[preSum.length - 1] / 2;8 W5 f$ f, O; _) n" u# |9 C8 h
       if (tot == nums.length) {/ ]: e# d5 L: w" l$ ~# ~
           return 0;: I4 {) d/ T! `% g- G) F' o
      }- S) y  ?' F3 x& @  a
       int max = 0;2 a8 k7 x. m- W9 ~; y5 V
       for (int i = tot + 1; i < preSum.length; i++) {& O0 _. A+ h/ J* T; k
           max = Math.max(max, preSum[i] - preSum[i - tot]);# R/ C9 K+ ~2 E) c9 {: E5 R- H* K$ I
      }
' g+ y$ T' b5 w  g- I/ p( s; j! J8 {$ u       return tot - max;
# s" e6 z  E: P  }
3 C1 A/ X5 I1 m7 O( a6 U}
, x  M4 O4 C/ a
% j5 H- |9 _/ Q  L! \, I) ~( S1 p# R( o" v# ~/ a
【 NO.3 统计追加字母可以获得的单词数】
: a3 S, D$ S$ R( w# G: X* `6 o. Q2 ^; B# D' K, h. g( g
解题思路
0 R( Q8 l% g0 h; M, M8 Q注意审题,只能追加一个字母。
4 ]) J0 ^( O* B& O3 Q! `& V0 a. U1 E+ u0 k  Y% T: d
因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。  l& l+ j+ e* [# p$ a5 r- {& D
% g7 }2 ]5 A. Z+ J
代码展示
- z" H4 q, r8 o& q
; p0 Y+ g+ \" `. B. Oclass Solution {; A3 e! w# j, W6 U6 k
   public int wordCount(String[] startWords, String[] targetWords) {
8 _( D  Z! h6 b       Set<Integer> startSet = new HashSet<>();
5 A% m$ _: s" g$ r) M" @2 C       for (var s : startWords) {7 |( ~* d! D8 D8 F, M5 g
           startSet.add(toBinary(s));
, s9 w! @8 V5 B+ Z" y% p. K      }
' y- l' {: D- |2 p. e- U2 V       int result = 0;
8 G: q+ ^. e- A7 b8 o       for (var t : targetWords) {4 [- X6 O& k0 }1 P  P: G3 C% @
           int target = toBinary(t);
0 c( f5 a7 b$ ~4 Q           // 枚举追加的是哪个字母0 \2 Y9 Z5 O0 k9 ^! ]5 x8 ?' q
           for (char c : t.toCharArray()) {% X) D6 x$ R0 o- ]6 L+ \' X" [
               if (startSet.contains(target - (1 << (c - 'a')))) {. k+ W0 M% l( D  w5 S- }9 G
                   result++;- s/ E1 t+ _% A7 u* I& O
                   break;" M3 W; L+ `" z: R0 v8 i
              }
, x* }1 Z6 `9 q6 ~. a, U6 G! M          }8 ?! U% D. H0 G8 O6 l
      }3 T' |8 ~' A# R6 b% T1 ^6 l
       return result;
/ {) ]9 F0 S" \! b3 X% G% d  }5 }8 Q2 h  j* u1 l6 Z+ \
* h) `( g5 H- k8 j; o( X; ]
   private int toBinary(String s) {# ]( x8 Z* t3 A1 a1 t
       int res = 0;% u9 w( G  z$ \+ H
       for (char c : s.toCharArray()) {) w. \; }3 C+ x8 G& _
           res += 1 << (c - 'a');- N. [. V: f" Y! M
      }' X  p1 y/ ?% x1 P
       return res;, U: `: t. B9 _' c% \3 q
  }
9 S& C* W( v* O* m$ y! b( E: g}
6 Q+ b* R, K# E" ]" E" T( O4 O1 S! y8 Y5 M, y% C- S0 L6 z
( E  n  V2 n. d, Y9 G4 l: D
【 NO.4 全部开花的最早一天】
, ?/ ^: m* d2 y! l$ U
: X; T, ]- o( p/ b' p. g解题思路8 D* F5 [4 l/ X: R8 d, k5 Z
贪心,先种开花时间长的即可。
% P1 P/ U1 F2 y7 P% [" z% O8 g
4 ^- ]- {9 Q) |+ U! t代码展示
9 X* O. q* t; h# f  @8 p( g, L" Q$ ?& A
class Solution {8 Z& s( L% U5 t
   static class Flower implements Comparable<Flower> {
' M1 B; B7 C7 D& F       public Flower(int plant, int grow) {5 C  T+ V  ~1 F# P/ {5 A2 Q
           this.plant = plant;
; K/ w/ _% |9 X# `( X& a           this.grow = grow;/ w! N- t1 j! g: y/ ^1 p
           this.tot = grow + plant;' H! }  [; t' l+ l. q/ w* O
      }4 s7 a7 t4 a) n: k

4 T) g9 a& {7 C) ^# P% b       int plant;
$ O6 ~# P: W" E$ n       int grow;1 M, _6 W; b2 g9 w
       int tot;
. u4 c; L, u4 w: A' K  h8 \1 b' ~% I4 b
       @Override
3 \1 N! X  z' P0 D       public int compareTo(Flower o) {
6 H7 f* a1 x0 Z/ y- q" l1 }( @           return o.grow - grow;% ]- P* ]! J% g7 _4 `2 B$ x# K
      }
/ y6 q# l$ Y1 U. c# o% U. Y% D  }+ E( l& E6 u* V+ L- @4 {+ Q
- \6 q7 k/ K6 Y, b) z
   public int earliestFullBloom(int[] plantTime, int[] growTime) {1 P6 j) U) V3 A5 a3 {" r! b
       Flower[] flowers = new Flower[plantTime.length];0 H8 X2 ?7 m, |# @; A" }
       for (int i = 0; i < plantTime.length; i++) {; w. n" c+ u! x* ?6 p9 o  G2 r
           flowers[i] = new Flower(plantTime[i], growTime[i]);, c5 `9 X  k0 U( \
      }3 x6 w! w, }( B0 M" W5 m
       Arrays.sort(flowers);  p3 d' `: \, l
       int result = 0;
* c, |) m, Y5 S9 f  @$ h       int current = 0;5 e% J' m7 s4 l% ~
       for (var f : flowers) {
. b* Y: w  M& V! k: e           result = Math.max(result, f.tot + current);0 Q7 |% u2 L$ g5 v3 a% H" D
           current += f.plant;$ l, s7 D  m% ]+ O9 l) K; b9 A
      }0 {3 z& t2 s( ]4 ^
       return result;
# J9 J$ i6 W' ^$ m! \7 f7 `  }
$ R1 Y. o. V7 |4 V" G3 _}
" F% D5 w2 P5 J$ m9 q
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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