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

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

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

UWCSSA提醒您:

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

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

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

本帖最后由 上岸算法 于 2021-3-17 08:30 编辑
3 e; g) y; Q9 R
9 Q, f) J) G; c6 A3 ~
No.1 仅执行一次字符串交换能否使两个字符串相等
解题思路
签到题,枚举一遍统计出所有不想等的位置。
代码展示
  1. class Solution {+ [7 j9 `- N- p% f5 }3 X
  2.     public boolean areAlmostEqual(String s1, String s2) {
    4 d9 V* X$ o5 S& ^5 y( w/ k
  3.         List<Integer> differ = new ArrayList<>();9 [/ k5 [4 Y" R/ I1 z8 p, Y" I
  4.         for (int i = 0; i < s1.length(); i++) {
      c, g& n1 P( ^8 b+ x( r7 t. Z4 d
  5.             if (s1.charAt(i) != s2.charAt(i)) {1 \: j+ w# i1 L
  6.                 differ.add(i);
    6 u, ]) Y4 A; R: q( V. g9 Q0 [2 M
  7.             }: h, X) X' B0 R6 t0 G: V) K! m
  8.         }0 R$ ~1 J/ b7 T* ~3 f) y2 E* z
  9.         return differ.size() == 0 ||
    # G1 Y9 k5 p- C
  10.                 (differ.size() == 2 &&% I% x$ t6 |* Y
  11.                         s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&& P' ]. @  z9 v; H/ v
  12.                         s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
    8 K& t6 G/ S# E& }
  13.                 );
    2 c' o' O2 D# [/ B# d: ?
  14.     }2 ?& d4 ^# X/ z+ W3 e* Y  \
  15. }
复制代码
  p; w7 z$ K9 e
1 P1 _8 a/ Q& ]( \$ f; A9 w5 f
No.2 找出星型图的中心节点
解题思路
n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。
代码展示
  1. class Solution {: [# A" _# b3 p4 i+ m" Z. q
  2.     public int findCenter(int[][] edges) {
    0 N% w+ ~$ l  h3 W  k& K/ t
  3.         Set<Integer> set = new HashSet<>();0 n9 X. k( F% ]& P4 j3 E" h
  4.         for (var edge : edges) {; f! ^! @+ u- l0 t
  5.             for (int e : edge) {5 D- F- L% [( `. @. h% s. J+ \
  6.                 if (set.contains(e)) {, c0 O* }* P# b
  7.                     return e;# F* [, {. M8 `; i8 b& w
  8.                 }
    ( s; k/ {3 u: M! i- B  d
  9.                 set.add(e);7 Q- L+ D7 u3 @& s/ A+ r
  10.             }! K# \7 e7 b7 }, B. C- m
  11.         }
    7 V5 z6 Y: z3 @8 V1 w% i( h
  12.         return -1;0 D- V, d/ m5 F4 w+ ^& k
  13.     }
    % S8 U, f% o/ y/ m3 R
  14. }
复制代码
5 B1 }" [7 e' ^7 `/ Z+ ]
No.3 最大平均通过率
解题思路
贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。
代码展示
  1. class Solution {
    " E3 c5 c9 j' b! |
  2.     static class Class {$ b' X" J7 R7 E6 u3 l
  3.         int pass;
    # ^( p7 B2 P3 C0 \0 n
  4.         int total;
    0 F8 ]3 }0 T1 U3 `6 `; n  M

  5. 6 s4 E+ p% ?( K0 q( i9 Q+ o
  6.         public Class(int pass, int total) {
    # O0 J- R8 A2 A9 e) W  ~* z
  7.             this.pass = pass;  A2 V/ M# U5 w# u  y9 \
  8.             this.total = total;/ q: L  U' @1 A' Y9 e
  9.         }% @" W* @6 U% y0 P& ^3 X$ h  k6 X
  10. . q( k; D  B" f
  11.         double differ() {! z8 a3 v& [) p% g7 ^
  12.             return (double) (pass + 1) / (total + 1) - (double) pass / total;8 E+ I4 {/ C6 U
  13.         }
    3 \" V! ~2 ^) ]$ w( v
  14.     }: C# i5 R) v' m; Z2 w
  15. 4 w. s$ Y- g" H; v1 }* S  @  k
  16.     public double maxAverageRatio(int[][] classes, int extraStudents) {
    ; v9 U, ~$ b$ S4 v3 L- d1 ?
  17.         PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
    + k( `6 d' ]! d8 U% S* V4 g6 o
  18.         for (var c : classes) {3 I( n! n2 H& |: h
  19.             heap.add(new Class(c[0], c[1]));0 Y& C( D& Q, b2 G- b
  20.         }
    5 i% W! x- Q0 S1 A
  21.         for (int i = 0; i < extraStudents; i++) {
    5 o$ t7 s! Z6 q& q
  22.             Class c = heap.poll();
    8 }" `7 F% B1 L; v, W
  23.             heap.add(new Class(c.pass + 1, c.total + 1));: t" F5 r0 X1 B2 V+ n( Y# ?
  24.         }9 j+ b1 ?9 n! S* t
  25.         double sum = 0;) }1 z% u7 N+ E$ H8 O: ]
  26.         while (!heap.isEmpty()) {
    : G* z, \4 d; o( c) E& b0 e
  27.             Class c = heap.poll();
    % T. v& T6 v" j. L* a# z0 J6 w
  28.             sum += (double) c.pass / c.total;" y) Y+ P: W$ S' n, j& [
  29.         }
    " O6 T% J+ d# ~& P
  30.         return sum / classes.length;$ U# T( {( f. o9 R% Y8 L8 ]; L' B" f
  31.     }" d3 j- a' l0 D8 \" B2 C
  32. }
复制代码

( o; j7 }- {: M7 W
No.4 好子数组的最大分数( n8 ^) p6 N1 G1 n2 o; G
解题思路
单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。
代码展示
  1. class Solution {
    " q8 B) `$ a+ k! ^" T# S
  2.     public int maximumScore(int[] nums, int k) {  @# H6 b; d. b' N
  3.         int[] heap = new int[nums.length + 5];1 l& [! d- u& C, G$ c8 j; I+ y
  4.         int top = 0;# I3 n* h2 |! E; ~) C. L& {
  5.         int res = 0;
    4 R( d# z; o4 [) ~
  6.         for (int i = 0; i < nums.length; i++) {+ {3 t" e. g" n4 G
  7.             while (top > 0 && nums[heap[top]] > nums[i]) {; ~  E# E- c1 T: x$ Y4 S0 x
  8.                 int right = i;* q: Y* o1 Y# d; K) r  ]
  9.                 int left = top > 1 ? heap[top - 1] : -1;
    - X0 K- y  I1 ?8 p  B, ^2 N
  10.                 if (left < k && right > k) {
      v* }& n: g) x2 t
  11.                     res = Math.max(res, (right - left - 1) * nums[heap[top]]);/ ]8 L( ~' ?9 L8 {$ G1 r
  12.                 }3 j' l- J* F4 o) B- E
  13.                 top--;0 L3 D) d; v, W' c
  14.             }' `' N; i! S9 y3 m% r1 |
  15.             heap[++top] = i;+ Y+ |  u: Z: k8 V" U* R
  16.         }
    - J6 V: g! N- _
  17.         while (top > 0) {
    % Z4 F9 x& k. L& `* m: M/ a
  18.             int right = nums.length;0 a1 Z; P7 [; R
  19.             int left = top > 1 ? heap[top - 1] : -1;1 W& r- j' _; h  O% Z1 F; |
  20.             if (left < k && right > k) {! W- n5 O% r  Q. y6 T( R# g5 @8 P3 u
  21.                 res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    ! f6 W2 i6 H8 b: ]
  22.             }
    . l! J+ p) m: ]' R8 }* ?4 G- D' \$ y
  23.             top--;
    ( K# a) C% f3 D6 A+ n
  24.         }
    * l3 E( }' P6 R
  25.         return res;
    9 y% v7 h  v' q! V/ Z$ p
  26.     }: `4 z7 ~4 `: ]9 Q2 k5 ~
  27. }
复制代码
联系上岸小助手年糕,参与免费带刷
( Z6 {* p( P( l4 c+ D

本帖子中包含更多资源

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

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

本版积分规则

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