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

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

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

UWCSSA提醒您:

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

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

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

本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 8 o5 k" M3 y8 k* E' `" P

, A$ h, h" I5 V) t. W. C- n
No.1 仅执行一次字符串交换能否使两个字符串相等
解题思路
签到题,枚举一遍统计出所有不想等的位置。
代码展示
  1. class Solution {
    . I* Y+ i$ f; c! J: k: V
  2.     public boolean areAlmostEqual(String s1, String s2) {
    9 v# Y+ J1 X% X1 Y3 L7 n& [' t
  3.         List<Integer> differ = new ArrayList<>();1 {9 f4 H6 G- B' i) p# z
  4.         for (int i = 0; i < s1.length(); i++) {
    7 l6 v6 P1 q3 ^) k
  5.             if (s1.charAt(i) != s2.charAt(i)) {" A& [9 W2 V: i& M7 }
  6.                 differ.add(i);% c% Z* t4 _* J/ C$ K* E
  7.             }
    * M, b* o2 o1 J$ ^3 ~; f1 p
  8.         }. a, ~$ c9 L  O4 f) T7 d
  9.         return differ.size() == 0 ||
    # k+ j/ \. k! B, r
  10.                 (differ.size() == 2 &&
    * |: U; s  n# M# M# e9 v( B
  11.                         s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&3 z; u, y2 q  L2 p
  12.                         s1.charAt(differ.get(1)) == s2.charAt(differ.get(0)), O: Y) e" b0 q/ |7 _$ C
  13.                 );# Z+ J0 e4 q3 p+ H: W6 m
  14.     }- T& Q" T9 A: g6 O; D6 ]
  15. }
复制代码
6 C  y, W, }+ g9 o& C, Y
- E( h2 ?+ I! R& A$ L) e% |
No.2 找出星型图的中心节点
解题思路
n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。
代码展示
  1. class Solution {- j, z+ \' |, V" k
  2.     public int findCenter(int[][] edges) {
    - \# s0 g& ^( R% v- x1 a: g& Z2 H4 `) a
  3.         Set<Integer> set = new HashSet<>();
    3 n4 f9 p/ B5 j7 ?7 }
  4.         for (var edge : edges) {3 R. S/ }6 k4 O; _4 {6 }
  5.             for (int e : edge) {
    : W1 h; l7 t4 H  [9 t- s/ P! ~
  6.                 if (set.contains(e)) {
    : ]$ |8 ]3 T8 x- q
  7.                     return e;& _0 d" y5 [% P4 [' N. m" V
  8.                 }
      u9 B  c0 Q: h2 m; ~$ ?/ U, _
  9.                 set.add(e);- F) b# Z5 u5 Z' b6 C8 z; k
  10.             }% f, x  d: Z+ a0 t. M
  11.         }
    . E6 {& V5 x9 m" i
  12.         return -1;$ ]( y! Z, D5 p# x! [7 t  y
  13.     }
    9 c4 i) u* d! L& v7 j" i
  14. }
复制代码
, a6 k) O; H4 g# p. P
No.3 最大平均通过率
解题思路
贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。
代码展示
  1. class Solution {" f3 M/ d3 C" Z
  2.     static class Class {; h. T3 \* L& v9 K# ~* M
  3.         int pass;/ c7 ]1 H2 n, d0 l" d- j; I" j( }  T# C
  4.         int total;
    ; R8 q$ F# s  ^" A8 e/ \
  5. " \( _% U- B; n3 Q( `, n* H
  6.         public Class(int pass, int total) {1 G" `+ a9 T' D8 g
  7.             this.pass = pass;& ^9 m) F5 O  I6 T
  8.             this.total = total;, e: O" v- \, g: u- _9 G' ^
  9.         }
    , ]6 E3 ?  |+ W% m' `0 V0 D5 U4 x
  10. ; \/ W, v$ p5 `) Q2 Y
  11.         double differ() {0 R8 c7 X$ y( @+ Y' U) i/ z" D
  12.             return (double) (pass + 1) / (total + 1) - (double) pass / total;$ ~* v* ]/ q1 z2 W8 d' l& B
  13.         }
      x7 U7 x( H# D$ K' n
  14.     }
    5 g2 [2 }# r; `/ g

  15. : g: b- z: X8 L$ ]! s
  16.     public double maxAverageRatio(int[][] classes, int extraStudents) {2 [0 m1 R. {! [) ?  _1 s
  17.         PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);. {( l- {' {% G  q: o" A
  18.         for (var c : classes) {
    6 U5 F  e. O5 y) V
  19.             heap.add(new Class(c[0], c[1]));7 y$ q  w+ S9 @4 f
  20.         }7 w" \+ q5 |" [$ ]2 N( x2 j) ~. f
  21.         for (int i = 0; i < extraStudents; i++) {: V3 g7 }- E% P- [/ T# K5 a6 L
  22.             Class c = heap.poll();: U$ T0 y! E7 C
  23.             heap.add(new Class(c.pass + 1, c.total + 1));7 O5 ^6 G% [, ]0 c
  24.         }. [; T: P0 _4 E9 e% x. @2 Z
  25.         double sum = 0;
    . e. ]: I% S9 x
  26.         while (!heap.isEmpty()) {
    ) E% c# ?2 y1 x; s# t
  27.             Class c = heap.poll();
    # M2 o1 Z9 ]0 V' X/ x- F) L
  28.             sum += (double) c.pass / c.total;
    9 m2 z/ m# |. J9 p3 ~; v
  29.         }9 `; x& D9 X( N0 F
  30.         return sum / classes.length;
    - l- @0 M: [6 y. G  f
  31.     }
    4 N: o& P, }2 i+ C; p) {" X
  32. }
复制代码
/ Z. l# Y& O4 {' i4 m
No.4 好子数组的最大分数: F# @$ V4 y6 ?8 Y0 s' d$ Y+ @1 K0 s3 {) d
解题思路
单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。
代码展示
  1. class Solution {
    1 p6 B4 b1 ], V
  2.     public int maximumScore(int[] nums, int k) {
    3 I8 }3 Q. S0 Z2 u
  3.         int[] heap = new int[nums.length + 5];
    - w- k: K( M* ]% v; h
  4.         int top = 0;
    6 M) v0 M: c0 k: f  P: h5 w8 a
  5.         int res = 0;6 {5 i- @+ i1 ?/ D, H
  6.         for (int i = 0; i < nums.length; i++) {
    % K. f+ M5 c; \2 i# t% r" N
  7.             while (top > 0 && nums[heap[top]] > nums[i]) {
    $ r/ t) c2 X1 C
  8.                 int right = i;
      T; U( o/ z% X) e  u
  9.                 int left = top > 1 ? heap[top - 1] : -1;
    7 I/ q3 v$ R; t9 b% s0 X6 v$ u
  10.                 if (left < k && right > k) {( Q% z  E: u, ^' n- b; I; i
  11.                     res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    3 T, J* K0 Y: [! ~; G2 w' h; a
  12.                 }
    5 s, M8 J3 ^7 j7 [) D, c6 N/ s
  13.                 top--;
    " m7 [# G) ^+ A, D
  14.             }8 y" {9 W$ G9 e" t
  15.             heap[++top] = i;3 y, ^. C; q, a4 K% d$ l
  16.         }
    + Q9 u7 g, {: B* G
  17.         while (top > 0) {
      q# W" F1 H$ q; ~' U1 Z* ?- c
  18.             int right = nums.length;
    : T% t; P9 g* ?0 I4 O' b: w5 N' Q; C
  19.             int left = top > 1 ? heap[top - 1] : -1;
    & y5 C- X/ p) E3 U: ?4 {% @: G
  20.             if (left < k && right > k) {
    7 K: f" j+ q" }' G2 k
  21.                 res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    : c6 F2 k  u) [1 `+ u) K
  22.             }  J' Z2 R- j9 j: k' m/ T6 A& Q
  23.             top--;
    - ~/ {3 S! j8 Z3 N: r; ]$ S
  24.         }
    9 D/ j# t3 r! x
  25.         return res;
    5 x7 u! J* L4 q
  26.     }# C9 {, t+ k' c7 c1 {% m' j) Z
  27. }
复制代码
联系上岸小助手年糕,参与免费带刷
# k6 W2 M$ ~9 V# u

本帖子中包含更多资源

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

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

本版积分规则

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