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

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

上岸算法 回复:0 | 查看:4502 | 发表于 2021-3-17 08:20:17 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 3 M! H  H( N. r- B: [

" H/ h# Y( }/ F: b  m! N
No.1 仅执行一次字符串交换能否使两个字符串相等
解题思路
签到题,枚举一遍统计出所有不想等的位置。
代码展示
  1. class Solution {: m3 y: ]- K7 o. J5 V) r+ P9 q
  2.     public boolean areAlmostEqual(String s1, String s2) {
    9 Y9 @9 a2 P3 d* ^& e
  3.         List<Integer> differ = new ArrayList<>();
    ' {" w. R- i" E1 V* f
  4.         for (int i = 0; i < s1.length(); i++) {& _* f! U; K$ ?
  5.             if (s1.charAt(i) != s2.charAt(i)) {% ~5 l" }' `; {) @
  6.                 differ.add(i);
    : w0 \0 ]" [  v8 I- o! B( K
  7.             }
    $ b3 d" \5 h( n, S
  8.         }
    ( V# D$ r* g6 d0 y* _6 g& }, z
  9.         return differ.size() == 0 ||+ V1 D) f+ ^* R# \& A8 ]
  10.                 (differ.size() == 2 &&3 ~! B: r; E! x! v3 |! }2 I
  11.                         s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&7 y8 s: t* ^* a$ q$ E, k
  12.                         s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))7 f5 u  Z6 p" I7 @
  13.                 );
    $ D6 a2 x& b* W6 I; t# E5 j* F
  14.     }% i0 H6 z; c. p: t) ]$ }
  15. }
复制代码

/ c" {3 u" h/ ?. i) K9 K

5 a5 d4 e7 k2 d
No.2 找出星型图的中心节点
解题思路
n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。
代码展示
  1. class Solution {
    ; y3 r' `3 C% N7 L3 m
  2.     public int findCenter(int[][] edges) {
    3 t9 o2 K, b' N! l# ?5 W) c
  3.         Set<Integer> set = new HashSet<>();2 ~/ p9 H+ P" U1 ?. V. C) H8 E# z
  4.         for (var edge : edges) {6 X3 b, {) _2 }: C
  5.             for (int e : edge) {, f: |6 k4 M5 _+ u/ W5 L
  6.                 if (set.contains(e)) {
    : N! y1 B# U2 E: G& r9 I* X
  7.                     return e;
    + o$ d, B- b4 w+ Z4 o8 w0 n: @0 e
  8.                 }
    * a3 D4 @' J( F& u6 ?' U4 ^: y% u9 p
  9.                 set.add(e);
    . s5 E  T; q8 [" c$ P. N
  10.             }1 ]. Y% ?9 P: F. o6 K
  11.         }! O+ f3 g$ j6 [* m  Y; w' t0 j+ {
  12.         return -1;
    0 z6 |. Y( K4 _5 S# W2 q' k
  13.     }
      d) g1 n8 b5 O+ y
  14. }
复制代码
( u! M5 N( {6 t  O
No.3 最大平均通过率
解题思路
贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。
代码展示
  1. class Solution {
    , a5 g0 h  F7 }5 Y. Z
  2.     static class Class {
    * X+ E# d0 s. N. Q" ^& `# p
  3.         int pass;) n; Y/ J( b# A
  4.         int total;+ n/ c+ h7 }6 o2 O1 C4 l& l" g
  5. / q' h: e, p& Y( l3 C0 M' L
  6.         public Class(int pass, int total) {# @. X* I8 r. t. A
  7.             this.pass = pass;( s! U! K% ^2 p4 o+ ~$ ?
  8.             this.total = total;
    ' X1 I% X# [4 o8 d& [1 a" i9 _
  9.         }
    9 h# z. J5 r0 n0 v

  10. . @; o0 z+ R0 v- [: y0 w
  11.         double differ() {& _# P4 B) m& h( @8 \  v2 o- z
  12.             return (double) (pass + 1) / (total + 1) - (double) pass / total;0 L# ]1 p& f3 W- f% w
  13.         }4 S, w# G; r  n  F! U$ y
  14.     }
    ) I3 X, `2 x1 n+ d/ Q
  15. : }& V' A, n7 c! U6 N
  16.     public double maxAverageRatio(int[][] classes, int extraStudents) {+ W. G( s6 V" q6 ?6 `
  17.         PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);( a* z) z2 C2 u0 P- w5 B$ X. \
  18.         for (var c : classes) {
    4 S2 O! F# M4 P5 d$ f) m$ I
  19.             heap.add(new Class(c[0], c[1]));: A2 ?3 r+ f& R' l0 t' }- B
  20.         }
    ( Y: h2 W; n5 a, Z- I7 }
  21.         for (int i = 0; i < extraStudents; i++) {
    5 j# B& ~2 r# Q" L' Y6 L
  22.             Class c = heap.poll();5 n* [5 Y6 l" {/ a) C- f3 o. }
  23.             heap.add(new Class(c.pass + 1, c.total + 1));; Z; l8 r6 `8 P3 A- u/ x
  24.         }
    5 Z# u. J+ @& P" A$ g- V/ Z
  25.         double sum = 0;8 x7 J% U7 y& u% y% X
  26.         while (!heap.isEmpty()) {
    . R9 r( ^  u! E( X
  27.             Class c = heap.poll();7 j. w5 ?4 f3 U4 i5 Q' q0 ^5 F
  28.             sum += (double) c.pass / c.total;3 M2 K: E3 O, v7 w* j' W- J
  29.         }
    . e" o/ m/ y# e
  30.         return sum / classes.length;
    & P0 e4 @- F( {0 H' G
  31.     }# w# _! K. n6 N9 o1 l
  32. }
复制代码
& i9 K4 X, c- g/ @% @
No.4 好子数组的最大分数4 a4 m1 p5 W$ q- S( e
解题思路
单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。
代码展示
  1. class Solution {! n3 R0 `7 a. o/ L6 q, Z
  2.     public int maximumScore(int[] nums, int k) {
    - ]4 M( w% n/ g- F) ?# k0 n
  3.         int[] heap = new int[nums.length + 5];0 ^$ ^% A# n8 d' _- X7 h
  4.         int top = 0;
    % G3 T5 m: ~. h) ?0 k' K4 O
  5.         int res = 0;* O+ @( b0 ]7 H# \. A/ P' S( F
  6.         for (int i = 0; i < nums.length; i++) {
    ) f6 M1 ~9 B" \
  7.             while (top > 0 && nums[heap[top]] > nums[i]) {% B! }2 R+ o. K+ C
  8.                 int right = i;
    1 R2 h" X4 t# \2 G
  9.                 int left = top > 1 ? heap[top - 1] : -1;5 \- n4 j1 G1 ]4 w8 [( ~
  10.                 if (left < k && right > k) {
    7 q$ U, W1 k! ]: X" t
  11.                     res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    7 j/ r3 z" p/ B9 e
  12.                 }7 d3 ^' _* B5 w% u6 M. h. R
  13.                 top--;) \5 g; e9 X' h# l
  14.             }! l" A' J( m  o" u
  15.             heap[++top] = i;
    / v+ I% M: [9 c4 K2 ~2 U9 o2 C, q
  16.         }1 [& r" K) l, I; h3 n- {9 s
  17.         while (top > 0) {
    8 a! E4 g+ c" a4 G
  18.             int right = nums.length;  u1 S' X! l6 s1 J$ \5 a4 Z5 Y  n5 q
  19.             int left = top > 1 ? heap[top - 1] : -1;( O$ X/ ]$ u" y4 N+ T% I0 H  D
  20.             if (left < k && right > k) {
    " z9 q- v! [; s# q" M# @8 V+ O
  21.                 res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    0 c7 I; h3 J. l! r( f
  22.             }) d1 \( e' j( p; _9 T3 b
  23.             top--;4 x0 }, L+ Q9 O
  24.         }7 _, }' I0 [1 Q$ r0 s
  25.         return res;
    4 E5 o( b1 @/ J, C. D( z( W
  26.     }: z" ]1 M9 ?0 m8 X) h2 a: p
  27. }
复制代码
联系上岸小助手年糕,参与免费带刷
+ ^4 O: h7 b) A- M: X. f+ a3 u

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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