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

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

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

UWCSSA提醒您:

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

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

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

本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 ' g. l% ]( w1 P1 e6 \# S  |# B$ x
* O0 k3 B6 C; }' C
No.1 仅执行一次字符串交换能否使两个字符串相等
解题思路
签到题,枚举一遍统计出所有不想等的位置。
代码展示
  1. class Solution {
    . j5 R: v. J1 f9 d9 Z$ h, w# _! ?, I
  2.     public boolean areAlmostEqual(String s1, String s2) {" {) x. w% q5 Z+ t+ n
  3.         List<Integer> differ = new ArrayList<>();
    ) l7 j( G1 _1 y; Y% v1 X0 o  m1 ]- l
  4.         for (int i = 0; i < s1.length(); i++) {9 ^5 |: i$ u0 Q9 O
  5.             if (s1.charAt(i) != s2.charAt(i)) {
    : w( Y  Q4 F9 x2 H2 H0 o
  6.                 differ.add(i);5 s+ L% f& f4 D3 F3 f) o1 _
  7.             }6 ?! R9 B; i; J4 n- Z5 H2 b
  8.         }& L2 e3 `! I( T7 g- @5 i) X
  9.         return differ.size() == 0 ||7 f0 g# B% m  d0 p  {
  10.                 (differ.size() == 2 &&
    4 e  X2 j: F, i5 N
  11.                         s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&
    $ i% J2 n. D1 b( H* k0 p
  12.                         s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
    ; X' A8 Q. q1 B
  13.                 );
    9 H% n8 z0 p+ o7 }( Q
  14.     }: y/ ~" h& r0 }+ E! j! N: p& P
  15. }
复制代码
6 r2 R. C! l# J4 V6 ?" {' Q
, F: g+ [+ H' H4 d1 Z3 S
No.2 找出星型图的中心节点
解题思路
n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。
代码展示
  1. class Solution {
    * s  U) S; ?; m' D7 i+ |6 S. n7 C
  2.     public int findCenter(int[][] edges) {
    & Z: i, l0 e: t" |( I
  3.         Set<Integer> set = new HashSet<>();
    / e* [2 {# G0 i- z4 z; c" h
  4.         for (var edge : edges) {2 {1 ?+ d0 W  w5 h2 }
  5.             for (int e : edge) {
    6 H* @9 [3 m, m0 o
  6.                 if (set.contains(e)) {
    ! v3 W% h$ n5 D5 A  n4 Y
  7.                     return e;
    ; `; M. ?, S' e1 U0 S
  8.                 }2 a9 Q0 f' i0 N! V  B1 Y3 E6 E
  9.                 set.add(e);% r5 U) j) }$ p$ i# Y: q
  10.             }- e* F( _6 K- O8 @0 i
  11.         }
    8 e$ P" }3 ?1 G+ E( V
  12.         return -1;; i+ h; U4 i% U; @4 M5 d$ n0 X
  13.     }4 Q4 `. ?" d9 l0 g! f) D( ~
  14. }
复制代码

1 }& w' g. g- w# o
No.3 最大平均通过率
解题思路
贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。
代码展示
  1. class Solution {
    ' z! O5 E& U* |$ C
  2.     static class Class {/ [* r) `5 q0 l; e3 b. {8 o
  3.         int pass;8 f; s) ?( g! s  ^  E+ S% N& [
  4.         int total;
    0 i" W& g4 T% j, u8 W4 r

  5. + f+ e- n3 ^' f  Y& f
  6.         public Class(int pass, int total) {+ z8 n/ `0 n% y$ ^
  7.             this.pass = pass;
    5 E3 e  A* |4 `: U6 A# X. v
  8.             this.total = total;4 n  W$ d$ l% \1 a/ l+ E0 C" n- T
  9.         }. T/ e  e' c4 y" b! p+ \0 Z. W: N  Q" B

  10. ( }" `& M; N2 W4 t6 I
  11.         double differ() {
    . ]9 e$ I) }( W& F
  12.             return (double) (pass + 1) / (total + 1) - (double) pass / total;5 w: W) M; f$ h
  13.         }
    * B7 `6 k: G% r' r
  14.     }& i2 H8 t$ Y" d$ T* @

  15. + h: L4 i& D, g) n, K
  16.     public double maxAverageRatio(int[][] classes, int extraStudents) {
    3 n5 s! F  J; H1 P
  17.         PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
    $ J1 c! ^- H' c9 A2 f: s
  18.         for (var c : classes) {
    7 ]5 x7 K$ R, r+ E1 S
  19.             heap.add(new Class(c[0], c[1]));" I% \$ q# q/ c( D; S8 x6 H+ `
  20.         }! u' I: ^& V: G0 A# ]# f
  21.         for (int i = 0; i < extraStudents; i++) {/ M5 M% ~7 ]) p& n& s% Y# u
  22.             Class c = heap.poll();: x" o; B: t. X; m. g6 `9 v
  23.             heap.add(new Class(c.pass + 1, c.total + 1));6 k! W7 j2 E) G9 ]* q, s
  24.         }, v* r  g4 m6 v( J" A
  25.         double sum = 0;
    ( S- W# ]2 m( L8 y6 e, E' g( g7 y" D
  26.         while (!heap.isEmpty()) {
    ' d- M9 z- M- ?+ ~) o% V9 N
  27.             Class c = heap.poll();
    : c) u/ Y, Q' Y' j  q
  28.             sum += (double) c.pass / c.total;( L, ?% F* T/ O8 d
  29.         }
    % ~2 u, |6 _+ w3 P1 H$ g* [( Q" e
  30.         return sum / classes.length;
    1 [' Y2 y1 {4 v! \
  31.     }( A$ I! e% A" E7 A! i' ~
  32. }
复制代码
, W+ d' a3 H2 k" O% R
No.4 好子数组的最大分数
7 c" Q/ ]" J) `
解题思路
单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。
代码展示
  1. class Solution {: i5 T- P0 p' ]3 g, y, U4 @$ l
  2.     public int maximumScore(int[] nums, int k) {
    6 J: \- Q: T" w
  3.         int[] heap = new int[nums.length + 5];: G) N9 I9 }( i: ?; {4 l) w* ?6 g
  4.         int top = 0;+ B  \# @0 _% x. y5 A! S3 N
  5.         int res = 0;# o# r1 u! W  \
  6.         for (int i = 0; i < nums.length; i++) {: s! M8 \# y; u" Q9 s$ o
  7.             while (top > 0 && nums[heap[top]] > nums[i]) {
    3 g( q: k4 @% N( M8 H. ~6 S3 `( z
  8.                 int right = i;. j! f# t  ^4 O& K, J
  9.                 int left = top > 1 ? heap[top - 1] : -1;* N, H$ D/ c9 R& g/ C
  10.                 if (left < k && right > k) {4 \& d: Z. O( y0 o, P. {
  11.                     res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    7 H8 L% _. r! |3 P
  12.                 }
    ) r7 X6 j3 K( H, C+ g& |
  13.                 top--;  {' G# Y% B* z% l
  14.             }
    ' D5 O. ~9 I6 W9 l9 ]. W
  15.             heap[++top] = i;6 h( O" p% i$ s0 t) S7 D
  16.         }2 z# s5 v, N, p) [0 r8 C
  17.         while (top > 0) {
    % E( N9 x, s, w7 F" e  A
  18.             int right = nums.length;1 f5 E+ B, O$ |# r
  19.             int left = top > 1 ? heap[top - 1] : -1;: i  n, |, c* _4 Y$ R1 S
  20.             if (left < k && right > k) {
      E8 e! F5 v* s2 H
  21.                 res = Math.max(res, (right - left - 1) * nums[heap[top]]);
    ! q1 k* H; J& M$ X/ ~. F* k+ X
  22.             }. F% c8 `* g. b. P9 r9 N
  23.             top--;2 e2 {! s" B7 B7 H5 W$ S
  24.         }
    9 G0 B* \+ V9 o; N! o
  25.         return res;* K8 u* Q4 ^( f3 ]0 i8 q5 i
  26.     }
    # h% x' I& {; O% T; e! x* G
  27. }
复制代码
联系上岸小助手年糕,参与免费带刷
' J* h# Q" k1 v$ @( B6 f

本帖子中包含更多资源

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

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

本版积分规则

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