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

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

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

UWCSSA提醒您:

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

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

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

本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 # c/ f$ v, g* q/ i
& ]% l* P/ M4 F+ K3 h0 ~
No.1 仅执行一次字符串交换能否使两个字符串相等
解题思路
签到题,枚举一遍统计出所有不想等的位置。
代码展示
  1. class Solution {: u3 k1 M! O2 T$ K* k  U' [$ A
  2.     public boolean areAlmostEqual(String s1, String s2) {8 T8 h) S! P% g8 H$ i5 M0 H  Q
  3.         List<Integer> differ = new ArrayList<>();
    , O# O) K( R, Q) B8 j2 G9 `
  4.         for (int i = 0; i < s1.length(); i++) {
    : [8 S9 m/ F* m7 K, \* {
  5.             if (s1.charAt(i) != s2.charAt(i)) {0 V3 a7 c* n# v& F6 V5 x
  6.                 differ.add(i);
    1 `8 U* D# ^, q/ @2 B
  7.             }
    1 m" ~. b; M7 B# i3 s
  8.         }$ V1 a8 k  O: `" R3 M; J- V
  9.         return differ.size() == 0 ||
    7 G- x6 q5 K& v' s
  10.                 (differ.size() == 2 &&
    * I' C: K8 V8 x' e/ S
  11.                         s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&
    8 C+ e& B$ W: b6 y  U
  12.                         s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))+ ]" `8 @# O( g5 j( E  o- w8 n
  13.                 );7 ~( N/ f( E& D7 r9 u% u1 R
  14.     }
    8 Q# _8 u2 J/ |" q- h
  15. }
复制代码

8 I3 l9 E3 E  t6 ]/ P2 B' f

, X7 {- z  P+ o; m4 W
No.2 找出星型图的中心节点
解题思路
n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。
代码展示
  1. class Solution {
    # T$ ~+ v8 ~, }
  2.     public int findCenter(int[][] edges) {2 \  D% `2 N9 ~. a- B0 O
  3.         Set<Integer> set = new HashSet<>();
    % ]# T# ], Q* l0 ]# K" N) v
  4.         for (var edge : edges) {8 S! f1 l" _! R1 I
  5.             for (int e : edge) {
    0 `1 F, E+ k( t5 y: I( W0 A
  6.                 if (set.contains(e)) {
    8 m8 Z4 P5 o7 L# x
  7.                     return e;
    # Y/ O" H; J2 }9 v+ @# D
  8.                 }8 }6 a4 W8 b! U
  9.                 set.add(e);' J" b8 K* L" I* v, {0 g% Z
  10.             }
    # ]7 d( f( M/ |
  11.         }9 q: D. E! t0 h) k
  12.         return -1;
    & m) Z( v- C! b& z* w' V
  13.     }" j/ C2 u4 z3 s, q- Z5 Q9 N3 n
  14. }
复制代码
% T! I' N  d( f% t) O; v
No.3 最大平均通过率
解题思路
贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。
代码展示
  1. class Solution {) e. Q0 m! U1 r5 n# [
  2.     static class Class {! u8 v6 T) K: I- f% {' Z
  3.         int pass;% g* w! d. b1 Z% n3 _
  4.         int total;! P- e0 f- z& x! c8 o; X
  5. ) h/ V/ v0 C, @8 I' j5 A$ x
  6.         public Class(int pass, int total) {+ }' `, X* v; m& X: j8 h! Y$ z
  7.             this.pass = pass;
    8 x, L/ R# b; x- c$ _5 ?
  8.             this.total = total;% W- g: ]# `  B9 |- }
  9.         }) S; n( x8 A- U8 G+ @/ F3 D' K
  10. : M( A1 ^# ~# d. `5 f- k: B
  11.         double differ() {9 `% W% `* l) x  d/ p
  12.             return (double) (pass + 1) / (total + 1) - (double) pass / total;
    ! S) ^: K! \3 _& T: c; E
  13.         }$ l; l" `! z. B0 C
  14.     }
    . Y, R9 Y" N8 Y3 X/ D! C
  15. 0 b/ f5 I3 u3 n# s' V' Q. ?
  16.     public double maxAverageRatio(int[][] classes, int extraStudents) {
    - R) I2 i0 K' b/ M( u3 ?# y7 }
  17.         PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
    + ^4 j- O0 `% ^
  18.         for (var c : classes) {
    & U0 K4 `0 D0 G& w
  19.             heap.add(new Class(c[0], c[1]));
    8 u; {9 A( N* e  Y9 `
  20.         }
    4 f# X' o5 I9 f
  21.         for (int i = 0; i < extraStudents; i++) {5 `) f& `; q+ z* J% {2 K, E
  22.             Class c = heap.poll();$ @# Y% Y5 E$ m# [3 a" n
  23.             heap.add(new Class(c.pass + 1, c.total + 1));
    - I9 h8 A) \1 X* c
  24.         }
    " z+ ]. w; k4 q) L7 N( y* o( i
  25.         double sum = 0;
    # k5 Y, Q2 {! @( f' z
  26.         while (!heap.isEmpty()) {
    % f* g0 n* H0 ~. H7 v
  27.             Class c = heap.poll();! [! c8 P; _: w/ x
  28.             sum += (double) c.pass / c.total;3 d; j9 o1 x  r* |/ b6 a
  29.         }
    0 T- T; l3 r; e) M0 f$ `
  30.         return sum / classes.length;
    9 L! u( Z% d, L$ n* m3 R* o
  31.     }2 ?/ O7 n) z  o* w
  32. }
复制代码

* i; E8 ~% [" w1 X
No.4 好子数组的最大分数
8 k/ ^1 m' t+ k# {1 Q) @
解题思路
单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。
代码展示
  1. class Solution {; o. F0 M' X: G9 S: d
  2.     public int maximumScore(int[] nums, int k) {
    + n) i4 Z/ D2 D$ D/ p. x
  3.         int[] heap = new int[nums.length + 5];
    / g; b4 C4 A# K& r+ ^# e
  4.         int top = 0;
    * E2 n* W6 k& F' B
  5.         int res = 0;
    0 Q+ S" c# k4 a# U
  6.         for (int i = 0; i < nums.length; i++) {
    ! V& B: D$ \# R( p8 l
  7.             while (top > 0 && nums[heap[top]] > nums[i]) {
    & J- l) a. a9 y9 G7 h& c4 B0 }# D
  8.                 int right = i;
    + {7 L4 J5 d! V" I3 H
  9.                 int left = top > 1 ? heap[top - 1] : -1;  \0 s3 C- R. K- F
  10.                 if (left < k && right > k) {1 e+ u7 K) I( K5 v* ?, R  u" ^
  11.                     res = Math.max(res, (right - left - 1) * nums[heap[top]]);; a" X3 _" Q8 ~* g2 d
  12.                 }
    6 z  ?% P3 K2 ]/ l- {- L
  13.                 top--;, y$ b  x' R/ d$ `& Y
  14.             }* g5 F" w; V/ X# B
  15.             heap[++top] = i;
    / Q. Q9 _: E2 d. [
  16.         }
    , g; B1 q" G9 s$ S! F/ O* H
  17.         while (top > 0) {
    % \8 [  l, g! q% d- L* j, R
  18.             int right = nums.length;' Z+ \' ^% p) P, |" j
  19.             int left = top > 1 ? heap[top - 1] : -1;# ?7 e1 i9 S) \( N8 F
  20.             if (left < k && right > k) {
    5 |* {. [% h1 X! J
  21.                 res = Math.max(res, (right - left - 1) * nums[heap[top]]);- x* V2 z. n- d" ?' ~" ]; j1 u
  22.             }
    . ^: l3 Q* l  r( K7 h4 p
  23.             top--;
    # }  J3 \2 m% t
  24.         }
    9 O" L' A6 u/ q! x) c* Y8 ^$ N
  25.         return res;: T/ n/ Q0 ]" X, g! s
  26.     }
    # [* p3 `2 y" b. G
  27. }
复制代码
联系上岸小助手年糕,参与免费带刷' N" \! W% ^5 r5 d* k  ?

本帖子中包含更多资源

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

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

本版积分规则

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