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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否每一行每一列都包含全部整数】
4 i2 v% y& A- M7 I/ }& B+ y, R+ B0 f. [, T
解题思路
- t( A$ o9 G, \8 t: K* n签到题,可以用排序做,也可以用 Set 做。0 _0 o# a1 U9 u* D  `4 [
- P: L! S" e; O0 Z+ J' O% f% K
代码展示
) T% f0 L, d# d& M
& w) p6 [4 C# O+ d# b- Bclass Solution {
# w5 a! k2 F( h; b( f$ a$ }/ s   public boolean checkValid(int[][] matrix) {
' A7 Q* r2 E. H       for (int[] mat : matrix) {
8 P0 g. A! U  |           int[] m = Arrays.copyOf(mat, mat.length);
3 m6 o( G' H; |3 o           Arrays.sort(m);
- E- N/ X. q7 T6 j8 M. [  L           for (int i = 0; i < m.length; i++) {
2 |( W+ @4 {. a" o9 y& H! s% x' T$ r               if (m[i] != i + 1) {& h- U! n; A8 G2 ~
                   return false;
8 d. |' P: q# z1 [6 k0 ?3 z% b              }
: g2 C$ R1 ~8 r% O          }2 a3 I' ^7 U/ \: g% @# W2 q
      }7 E1 Q* [+ O2 j! F& `+ O- G0 T
       for (int i = 0; i < matrix.length; i++) {
: R' l+ w3 p$ @, U$ l           int[] m = new int[matrix.length];
, N3 A' C& J: E( i7 F           for (int j = 0; j < matrix.length; j++) {
9 }: p6 l/ d3 Z; N/ j8 o0 F# u1 ^               m[j] = matrix[j][i];$ D( r7 w3 B# F) E8 |
          }3 }5 ?' J4 l6 D+ v
           Arrays.sort(m);# I* Z. C+ y* q. b, U# Z$ Q
           for (int j = 0; j < m.length; j++) {
. D# ]% R+ E. S' ~               if (m[j] != j + 1) {
" x: ^7 v; b0 K1 W" T/ L" J) A* T6 B                   return false;, p7 O# Q' r) b1 A) w
              }$ O3 ~( ]4 d5 f  g" W, M+ A
          }
. P: Y% U- h, y      }4 B: s1 ^  v/ F" z! c1 ]/ f
       return true;% |6 {9 d/ t5 b0 \' t/ ^9 V
  }
2 _5 v$ x6 w  @8 W+ g}5 l$ R' c+ g! q+ C% V: }
8 e# ^1 m8 ^, G8 ^1 P  a

+ M; K7 i2 y3 P. q【 NO.2 最少交换次数来组合所有的 1 II】
/ d: i% a% R% ^; v9 u' g( A" t1 ]4 m2 N/ Y* d* {* f( a
解题思路% T. W5 s% o/ D5 d0 B, M
首先化环为链(将 nums 复制一次拼接到尾部)。
% E1 \. y8 L, j6 T) Y6 _$ ]
/ k/ ]5 N0 E, o' v% D( T然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。* ^% V3 z6 d% w2 u- n& N
- e1 b) ~; w4 Y5 c7 H; w
每一段下标中 0 的数量可以用前缀和求出来。! x" G' y0 P$ E- Z- M1 Z
3 D9 }( A/ _# Z9 Z9 ^
代码展示
5 `, P! x6 Z% `5 _1 L% {0 ~- X5 X- I* L$ n8 }
class Solution {
: i0 ^+ I+ e8 W( x4 v2 d' Y   public int minSwaps(int[] nums) {
/ S: R3 b2 l. S, S( w: v5 q       int[] link = new int[nums.length * 2];0 l/ a  ~; C0 J2 L2 a6 o
       for (int i = 0; i < nums.length; i++) {$ {, h" F" {; {) \4 g8 `
           link[i] = link[i + nums.length] = nums[i];
! K, n/ c7 L; g% y8 Q, U      }7 i1 N$ j( r( x" B; P+ K5 J
       int[] preSum = new int[link.length];0 G+ g: R' V6 N# ^4 p) v
       preSum[0] = link[0];& {4 v' p+ v9 [! A" z
       for (int i = 1; i < link.length; i++) {' a1 H, Y5 D. \; b# [
           preSum[i] = preSum[i - 1] + link[i];
( K2 K- F7 a+ D; E9 C, i* E      }2 t, b: P  D* I. f, F- O2 ^) [
       int tot = preSum[preSum.length - 1] / 2;+ v: O; V# `7 c$ v4 f/ Y
       if (tot == nums.length) {" t7 Z* X5 o3 ]9 j
           return 0;4 ^- a, @- W5 e+ \, @
      }  `; q/ A, r0 I# N9 d9 M' p5 F
       int max = 0;' T: {( L$ F8 f7 }- \( S
       for (int i = tot + 1; i < preSum.length; i++) {! R5 o( x! p2 @7 T
           max = Math.max(max, preSum[i] - preSum[i - tot]);
; \8 y$ g5 }: E0 q1 H      }8 P! X% _8 K7 e. }4 S9 o
       return tot - max;, L6 C. m9 ?0 K# M# Y
  }! d4 |9 i  x; X. b
}5 P7 C9 G3 K  I! D$ o+ r6 ^, O
# }- H( b! N0 U
4 i, V/ p/ ]5 ~
【 NO.3 统计追加字母可以获得的单词数】
7 S2 C+ B1 P1 J; u3 E
3 ]( q0 C1 i% M8 b0 ?" t解题思路. C3 K2 t$ y7 [6 k  E
注意审题,只能追加一个字母。
2 ~5 b% O+ t$ V6 K: i7 `, _: z7 V9 J" }$ |% C
因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。
5 F$ O4 o) Y' f, k  x
5 f1 M! P' L7 L8 ~代码展示
0 {3 ^9 e& k; z' w1 F7 Q' Y2 e4 a( u) `0 O, C  Z, Q, q
class Solution {
- h1 p% J! [9 X7 C% p6 ^. q& s   public int wordCount(String[] startWords, String[] targetWords) {! S  Y) D; Y( a, R: |) r, z
       Set<Integer> startSet = new HashSet<>();
; n$ ]6 ^2 r. O, o' _       for (var s : startWords) {& K; ?! V# U4 w4 Q. J1 F
           startSet.add(toBinary(s));
; n& D- E7 @/ _# B( g+ M! {      }) w* y0 U% [: O* j- b! t
       int result = 0;
4 a* {6 x+ k+ M% F       for (var t : targetWords) {3 l9 H+ F* V# n6 v, q
           int target = toBinary(t);
5 C$ ?. J( l- h5 a           // 枚举追加的是哪个字母
& Z) E/ X; w+ E" Y7 X$ w/ S1 j6 ?           for (char c : t.toCharArray()) {, {: ^% |% w  e  t6 ?) B# W( _/ K
               if (startSet.contains(target - (1 << (c - 'a')))) {! `! c" z: G8 e. Q# P" N2 }! I! s# |6 _
                   result++;3 I$ |/ j, b; A) [# i* _' D
                   break;# v' M! ~6 V- v( S4 K. X
              }
/ ^; C  O, @3 x2 L          }* [+ b/ y3 e& ?  }2 _
      }- Z+ W* {+ U. ~# I2 w8 C
       return result;
0 m- a, q$ J/ B. q! }2 n0 y  }
; R  M5 b% M) H' ]/ B& c2 k
+ E; e. `$ l6 X' m% g   private int toBinary(String s) {
1 ]$ L) d* w" s& m8 `- t# {       int res = 0;
1 r% a- W" b, b, {9 G+ J       for (char c : s.toCharArray()) {
( d4 X7 o) g0 ]" ~           res += 1 << (c - 'a');
$ F- c: Y! u$ V- `; ]7 Z      }1 s6 x5 d$ U: e% t( K/ l
       return res;
5 c" |. r' p  B% N, }( A  }0 _4 S/ t: u: X  F, ]9 h$ V5 w- X) m. W1 M
}  z0 A5 B  W3 N* ^6 t9 X8 T& ?+ ?
+ g6 ?+ A* c. T& m
% ^6 ?6 g' G" b9 t: e2 K% i
【 NO.4 全部开花的最早一天】( d$ Q$ X& a! i9 U7 n
4 o, B  [: G: C
解题思路
. c5 i5 s+ x2 D( D" y' S贪心,先种开花时间长的即可。& @; l; c/ A. S7 `* j. S' z

8 L8 _8 [. c0 M" P代码展示- U  @& ]1 y! w6 f

% @+ x& h" O1 {4 ?6 ?class Solution {
' @7 C6 Q  C5 x" C* [1 Z   static class Flower implements Comparable<Flower> {
5 N1 g* h. s. k# z! d7 j       public Flower(int plant, int grow) {# q: t5 x5 H3 m. T; v
           this.plant = plant;1 l  q* p* C. h" i+ G, t
           this.grow = grow;$ }9 a! D0 c8 O6 K6 K& M* J
           this.tot = grow + plant;% U) I! V7 M- B1 h8 [! ]8 E
      }. }. L! Z$ _: R/ `3 `
5 J! S( {* o5 {8 I% I5 U6 m
       int plant;* ]$ C: Q* Q5 |9 H. Q
       int grow;) h7 C, m1 H- j
       int tot;& H" b5 C5 S4 M4 c- X4 Z

' G* b% c1 o% z) q2 r: `$ r       @Override$ m3 L2 E0 M% |: Z4 c" D; F+ z
       public int compareTo(Flower o) {+ [: ?4 j7 p: l/ @
           return o.grow - grow;
0 i" G+ n, c0 Q% b3 P      }& I3 R$ N* h+ \8 n" t
  }
/ n! T( n5 g' V: U, s) q
( Z+ T/ @+ C0 z7 g; j- J   public int earliestFullBloom(int[] plantTime, int[] growTime) {# [5 q. h6 q6 V6 m9 P9 J
       Flower[] flowers = new Flower[plantTime.length];
% t4 \& [5 g0 n& Y% {       for (int i = 0; i < plantTime.length; i++) {; `+ H, y: `0 b/ u' m$ T/ o
           flowers[i] = new Flower(plantTime[i], growTime[i]);
; a0 O2 B. Q! ~1 t      }; T6 x* I% z/ c$ ?
       Arrays.sort(flowers);
* ~. }' c+ q! z4 e8 h: F       int result = 0;
- |! ^! \, m# O- d" K4 `+ b       int current = 0;. o* n  ]" d: Q  R! K# H' x0 j; R
       for (var f : flowers) {/ x5 h( S4 {9 ]1 Z& i0 E1 u% a
           result = Math.max(result, f.tot + current);
( Z' N# x/ O% x: M$ E4 P: M: g           current += f.plant;
) O5 X5 j2 Z7 K6 O7 W      }+ a3 a9 R. Z; _/ s( \& a/ F
       return result;$ h) x# z3 Y: U  r
  }/ f# o6 E7 [& k! U
}" O% E0 J. n- m( }: s
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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