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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否每一行每一列都包含全部整数】0 Z/ A0 L3 q! W/ m
6 z! K) N( g+ P$ o9 \
解题思路5 p, p6 D: c; }* c% a% n
签到题,可以用排序做,也可以用 Set 做。7 s) _% W% a% ]% o9 s

, F: i* R2 {. G/ Y5 Y代码展示6 k+ \4 f& u' ~" p; g9 P/ d
. S4 p% l0 l/ S" Z4 Z# t* P
class Solution {
( J" i. Q2 t# ^: M  }   public boolean checkValid(int[][] matrix) {
3 d# K6 K% s; E0 O) s3 R$ k; @       for (int[] mat : matrix) {% j9 L* B# w: |7 ]& E/ C& ?, v
           int[] m = Arrays.copyOf(mat, mat.length);
! D  f) m. v7 m$ u           Arrays.sort(m);
' z% V7 ?- v9 s           for (int i = 0; i < m.length; i++) {5 x& z+ {1 F& j  ]6 \
               if (m[i] != i + 1) {
( ~: O- _% P- R) k; t                   return false;- e  ?, `0 |& \3 i1 `! s5 Z, R
              }
. M+ N3 u6 k3 F1 c( f2 m          }6 ?5 }- W/ G, {9 G# T+ R
      }# X/ y( V( x2 l& c6 U( ~5 f
       for (int i = 0; i < matrix.length; i++) {
+ C' W& h3 [$ w/ X4 @$ R           int[] m = new int[matrix.length];
) ~3 k# T% L9 B1 `# m           for (int j = 0; j < matrix.length; j++) {
/ x! w2 |6 k8 w% F, f               m[j] = matrix[j][i];, X+ V  J& \* ~' B
          }
' {2 a! E5 G/ L0 ]$ h           Arrays.sort(m);
: }7 ^6 `- T/ t; K           for (int j = 0; j < m.length; j++) {& \0 K( r9 S, m5 X% [$ ]( r) _9 w
               if (m[j] != j + 1) {7 E0 I! T/ t" c* _" B. L5 I6 ?. P
                   return false;
% f8 r! U/ M* e2 p              }$ L5 @% N: v* x1 x6 s
          }: r0 V& u9 ?' o4 p8 v
      }5 \9 |  h- g* x2 @; \4 z% S, K
       return true;% ^% N  c+ X9 ?/ j) m3 Q/ z) q! R
  }* s/ Z4 k9 H% f
}
/ ]# y' ?( B+ q# h" L" i2 l! m- B5 G% _
$ a( F6 ^# x2 B" j2 ]4 {$ V1 k
【 NO.2 最少交换次数来组合所有的 1 II】) ~" C2 c/ K' `' \! @9 o$ b# o+ U

& V5 ~+ C% X. l& [" N" B解题思路
+ b! ^0 @) X  G1 j& [4 C首先化环为链(将 nums 复制一次拼接到尾部)。$ P+ Z; {5 [- i8 }# n9 l
. ?" w' B1 Q; V6 E
然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。! b* ~# m( H; e  Z2 m8 z, y

  b  @7 ~. ?2 ?5 ~0 s! `- @/ k0 x5 s  X每一段下标中 0 的数量可以用前缀和求出来。- r5 d; v0 F# [; y+ @0 g

. d$ H9 F) V" U$ O代码展示6 ?! z' S: T/ t

6 c' x  u+ Z+ Y0 b/ g' E! @1 uclass Solution {7 _+ H3 e3 T& Y5 ^& K! L) a
   public int minSwaps(int[] nums) {
! |8 f9 A4 r2 ]/ ]' e# z: _5 v       int[] link = new int[nums.length * 2];; V% v* f+ ]9 p- \! {& N2 |
       for (int i = 0; i < nums.length; i++) {0 s- x" n/ E3 ]1 T9 Q6 `
           link[i] = link[i + nums.length] = nums[i];
7 Q; d! Z, s2 A) k7 Q      }
# P) i' \' E4 X3 Q+ A, R       int[] preSum = new int[link.length];! [( R$ D. q9 b" |9 G1 K
       preSum[0] = link[0];
+ q/ [) y- l  h  q       for (int i = 1; i < link.length; i++) {
% U; M# Z% z# o5 m4 T" H           preSum[i] = preSum[i - 1] + link[i];
5 A2 r$ l- q- X" {      }
, ]5 o8 a$ c5 n       int tot = preSum[preSum.length - 1] / 2;7 i9 Q- N7 F% E" b4 l' d) B( p8 H
       if (tot == nums.length) {
# @2 v# F4 z4 s6 W* @+ h           return 0;5 x% U4 O2 n" y2 w
      }/ b. v/ j) @+ l7 H: H+ p3 _
       int max = 0;8 p: U; P1 n8 K& y2 Z. M- w% s- `
       for (int i = tot + 1; i < preSum.length; i++) {
0 S0 R8 }3 ^% g           max = Math.max(max, preSum[i] - preSum[i - tot]);
% j7 a  ?' X# ^/ d. p      }
! v( |' P0 h0 {9 u" Q       return tot - max;
0 \! A: c2 z6 Q% f" S# I! J  }9 X$ D6 R* J7 C' i+ k# [3 M  f# ]& O% \
}
1 L( E; U9 Q! x0 H
: [+ m% G5 s  k$ k" r' X
" c  q! A; R2 R  R  _【 NO.3 统计追加字母可以获得的单词数】5 o/ M- h, f# y9 \6 S% A; ?

1 {, W+ C! W* ?+ g1 f解题思路: T8 @, P/ C4 J- z, G" b4 b
注意审题,只能追加一个字母。
. A( ^5 R) x% Z$ i8 R7 m1 P5 w
; N7 O  S. @' @$ B; l3 `  U因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。
% x. w0 A' y) S- L; S; i+ [8 y8 a2 J8 |
代码展示9 f  ?$ v. U2 M  k5 O

; _# Y$ Z, m" M  T; g& Aclass Solution {! b: j3 g( h* u  G
   public int wordCount(String[] startWords, String[] targetWords) {' u  d8 w, J% C/ o; s1 Y7 A
       Set<Integer> startSet = new HashSet<>();: U' o! o$ S0 J
       for (var s : startWords) {, n" V9 y: ~! J/ b1 i  B. |, A
           startSet.add(toBinary(s));
: z$ O+ O. @: L9 |9 F. c+ ]1 ?      }5 a- n  p" Q8 H
       int result = 0;8 f! h0 f( p, `5 X% |
       for (var t : targetWords) {! }' v* k# D! _3 v2 n
           int target = toBinary(t);8 e0 t9 q0 v9 l- H
           // 枚举追加的是哪个字母; k6 K) e& k6 Y& }
           for (char c : t.toCharArray()) {
  ^7 T! G% t2 B4 i               if (startSet.contains(target - (1 << (c - 'a')))) {- I" v" J/ F, |( ]0 o  A* T, S. }' p
                   result++;) h* z0 N, D, w3 R) l5 @5 Y2 r
                   break;! _/ F. i* V% e7 X0 t5 w! O
              }0 k1 r2 V: Z# w' E
          }5 T0 \: V4 ^$ S8 j0 r3 [
      }
( u7 X  d1 F  C  U& y       return result;- b% O$ L; p2 [/ M# Z# H% w! F
  }
4 S# U2 ~2 Y- z& n" i: H- v; b, y$ f1 {
   private int toBinary(String s) {
# P3 [, @: G* u8 v, S$ b! |       int res = 0;
5 J2 C7 x* e5 o& [3 V       for (char c : s.toCharArray()) {
9 S, l" z1 K" S- z& p7 I1 x6 M$ l           res += 1 << (c - 'a');
; y9 B4 q1 F9 u1 T* E7 G5 [( F      }
* o% V3 G( W0 b/ u; {* ~5 W       return res;
' m7 y% q5 Q( Y. p) m  }& X: n0 y9 H! ?
}& V" n7 p3 b6 V1 g* f7 B. f
3 s$ s4 B3 ^2 m. `8 m

4 `4 I% f1 r7 M7 x" G6 Y- H【 NO.4 全部开花的最早一天】
+ f. ?# _/ I3 `* }9 X6 Y+ F% }7 `( t
解题思路
5 A  d8 A* b" p) M. z, ?" I贪心,先种开花时间长的即可。- H/ D% S- T  W/ j. q; M, c

9 V! {& S  a6 b5 ?代码展示
$ A' i; g$ _* s! y# c5 k, {. p$ ?- W9 e# g
class Solution {8 O$ W7 ?& z- q" H+ i
   static class Flower implements Comparable<Flower> {, c, a8 W5 n1 f
       public Flower(int plant, int grow) {
+ o0 k: b2 \) v+ S; h           this.plant = plant;- N0 z, a$ C0 W/ O
           this.grow = grow;
; x" D$ k5 ?" U) \6 C' O. ^           this.tot = grow + plant;
" p8 K  E. v/ P  u0 o3 `% b      }( |% }6 g, [6 U. R0 {! P8 B2 s  K) M
% H- F; O2 A" Z% V
       int plant;
5 H; |; W/ v/ c$ k- a$ O) G       int grow;: B' I- g3 W6 G) g; a1 m
       int tot;: _* H2 Z5 K. L1 y* c% @- @

* S+ V& p# P" D( ^0 M. k7 [/ |       @Override; \8 S$ Y1 T' J9 l7 l; m
       public int compareTo(Flower o) {9 {7 {/ s( L; j9 Z; g
           return o.grow - grow;: B% J8 b  \. l- j  @% f- Z, v! S# c( O! Z
      }
5 Q7 J; n& }6 v$ a3 ~( ?- D' j  }
9 t( E3 C* n0 |2 |! p, ^" v% m9 G/ J9 F& _2 y
   public int earliestFullBloom(int[] plantTime, int[] growTime) {& J1 b# M& L2 v- ^! z2 t$ i& r; E
       Flower[] flowers = new Flower[plantTime.length];; K+ ]" d% i: o* \8 g+ s# X. C
       for (int i = 0; i < plantTime.length; i++) {1 w* [/ i) o4 T  b1 U! ]7 p2 D  ]
           flowers[i] = new Flower(plantTime[i], growTime[i]);, R, i( ?3 B- T8 a
      }
. x* l( X- {/ V, w* P6 B+ j       Arrays.sort(flowers);
8 R/ q: y8 D+ X$ o. D       int result = 0;
0 M$ F) H, K+ U% z$ @       int current = 0;+ \& S" r9 y  ?. g& v; R# R
       for (var f : flowers) {6 a7 t0 B) \" a" |- L! ^. L& n
           result = Math.max(result, f.tot + current);
3 n& a5 F+ F6 w* u0 v$ O' h           current += f.plant;5 U$ _8 x) a: F# C9 Y2 E2 Y3 M
      }
: k0 L1 u3 g6 z8 G       return result;3 J8 ^2 I) H2 Q/ f# y; z4 }
  }
/ c9 P9 @6 n( m# R1 }! U- N}
# F0 @% R& P- O+ K) a6 I  {
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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