本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 # c/ f$ v, g* q/ i
& ]% l* P/ M4 F+ K3 h0 ~
No.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {: u3 k1 M! O2 T$ K* k U' [$ A
- public boolean areAlmostEqual(String s1, String s2) {8 T8 h) S! P% g8 H$ i5 M0 H Q
- List<Integer> differ = new ArrayList<>();
, O# O) K( R, Q) B8 j2 G9 ` - for (int i = 0; i < s1.length(); i++) {
: [8 S9 m/ F* m7 K, \* { - if (s1.charAt(i) != s2.charAt(i)) {0 V3 a7 c* n# v& F6 V5 x
- differ.add(i);
1 `8 U* D# ^, q/ @2 B - }
1 m" ~. b; M7 B# i3 s - }$ V1 a8 k O: `" R3 M; J- V
- return differ.size() == 0 ||
7 G- x6 q5 K& v' s - (differ.size() == 2 &&
* I' C: K8 V8 x' e/ S - s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&
8 C+ e& B$ W: b6 y U - s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))+ ]" `8 @# O( g5 j( E o- w8 n
- );7 ~( N/ f( E& D7 r9 u% u1 R
- }
8 Q# _8 u2 J/ |" q- h - }
复制代码
8 I3 l9 E3 E t6 ]/ P2 B' f
, X7 {- z P+ o; m4 WNo.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {
# T$ ~+ v8 ~, } - public int findCenter(int[][] edges) {2 \ D% `2 N9 ~. a- B0 O
- Set<Integer> set = new HashSet<>();
% ]# T# ], Q* l0 ]# K" N) v - for (var edge : edges) {8 S! f1 l" _! R1 I
- for (int e : edge) {
0 `1 F, E+ k( t5 y: I( W0 A - if (set.contains(e)) {
8 m8 Z4 P5 o7 L# x - return e;
# Y/ O" H; J2 }9 v+ @# D - }8 }6 a4 W8 b! U
- set.add(e);' J" b8 K* L" I* v, {0 g% Z
- }
# ]7 d( f( M/ | - }9 q: D. E! t0 h) k
- return -1;
& m) Z( v- C! b& z* w' V - }" j/ C2 u4 z3 s, q- Z5 Q9 N3 n
- }
复制代码 % T! I' N d( f% t) O; v
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {) e. Q0 m! U1 r5 n# [
- static class Class {! u8 v6 T) K: I- f% {' Z
- int pass;% g* w! d. b1 Z% n3 _
- int total;! P- e0 f- z& x! c8 o; X
- ) h/ V/ v0 C, @8 I' j5 A$ x
- public Class(int pass, int total) {+ }' `, X* v; m& X: j8 h! Y$ z
- this.pass = pass;
8 x, L/ R# b; x- c$ _5 ? - this.total = total;% W- g: ]# ` B9 |- }
- }) S; n( x8 A- U8 G+ @/ F3 D' K
- : M( A1 ^# ~# d. `5 f- k: B
- double differ() {9 `% W% `* l) x d/ p
- return (double) (pass + 1) / (total + 1) - (double) pass / total;
! S) ^: K! \3 _& T: c; E - }$ l; l" `! z. B0 C
- }
. Y, R9 Y" N8 Y3 X/ D! C - 0 b/ f5 I3 u3 n# s' V' Q. ?
- public double maxAverageRatio(int[][] classes, int extraStudents) {
- R) I2 i0 K' b/ M( u3 ?# y7 } - PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
+ ^4 j- O0 `% ^ - for (var c : classes) {
& U0 K4 `0 D0 G& w - heap.add(new Class(c[0], c[1]));
8 u; {9 A( N* e Y9 ` - }
4 f# X' o5 I9 f - for (int i = 0; i < extraStudents; i++) {5 `) f& `; q+ z* J% {2 K, E
- Class c = heap.poll();$ @# Y% Y5 E$ m# [3 a" n
- heap.add(new Class(c.pass + 1, c.total + 1));
- I9 h8 A) \1 X* c - }
" z+ ]. w; k4 q) L7 N( y* o( i - double sum = 0;
# k5 Y, Q2 {! @( f' z - while (!heap.isEmpty()) {
% f* g0 n* H0 ~. H7 v - Class c = heap.poll();! [! c8 P; _: w/ x
- sum += (double) c.pass / c.total;3 d; j9 o1 x r* |/ b6 a
- }
0 T- T; l3 r; e) M0 f$ ` - return sum / classes.length;
9 L! u( Z% d, L$ n* m3 R* o - }2 ?/ O7 n) z o* w
- }
复制代码
* i; E8 ~% [" w1 X No.4 好子数组的最大分数
8 k/ ^1 m' t+ k# {1 Q) @解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {; o. F0 M' X: G9 S: d
- public int maximumScore(int[] nums, int k) {
+ n) i4 Z/ D2 D$ D/ p. x - int[] heap = new int[nums.length + 5];
/ g; b4 C4 A# K& r+ ^# e - int top = 0;
* E2 n* W6 k& F' B - int res = 0;
0 Q+ S" c# k4 a# U - for (int i = 0; i < nums.length; i++) {
! V& B: D$ \# R( p8 l - while (top > 0 && nums[heap[top]] > nums[i]) {
& J- l) a. a9 y9 G7 h& c4 B0 }# D - int right = i;
+ {7 L4 J5 d! V" I3 H - int left = top > 1 ? heap[top - 1] : -1; \0 s3 C- R. K- F
- if (left < k && right > k) {1 e+ u7 K) I( K5 v* ?, R u" ^
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);; a" X3 _" Q8 ~* g2 d
- }
6 z ?% P3 K2 ]/ l- {- L - top--;, y$ b x' R/ d$ `& Y
- }* g5 F" w; V/ X# B
- heap[++top] = i;
/ Q. Q9 _: E2 d. [ - }
, g; B1 q" G9 s$ S! F/ O* H - while (top > 0) {
% \8 [ l, g! q% d- L* j, R - int right = nums.length;' Z+ \' ^% p) P, |" j
- int left = top > 1 ? heap[top - 1] : -1;# ?7 e1 i9 S) \( N8 F
- if (left < k && right > k) {
5 |* {. [% h1 X! J - res = Math.max(res, (right - left - 1) * nums[heap[top]]);- x* V2 z. n- d" ?' ~" ]; j1 u
- }
. ^: l3 Q* l r( K7 h4 p - top--;
# } J3 \2 m% t - }
9 O" L' A6 u/ q! x) c* Y8 ^$ N - return res;: T/ n/ Q0 ]" X, g! s
- }
# [* p3 `2 y" b. G - }
复制代码 联系上岸小助手年糕,参与免费带刷' N" \! W% ^5 r5 d* k ?
|