本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 # ~/ X1 \: t9 ~6 P' j5 e W+ T$ B; p
! Y( `; j" c. V4 L! V
No.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {
5 }$ ]6 A) Q+ o$ H+ h% A - public boolean areAlmostEqual(String s1, String s2) {
- k. p& a& i# U& w% R - List<Integer> differ = new ArrayList<>();
0 ~& j- V. K+ j1 Q- s9 z* \: x6 u - for (int i = 0; i < s1.length(); i++) {
B6 e) ?* a. ?' p$ {" b; R - if (s1.charAt(i) != s2.charAt(i)) {
/ u1 n& ]) d8 c9 f - differ.add(i);3 D4 q0 e) D# K" Q8 |7 a
- }
+ i6 V) R* e/ ^( w* t6 C) T# s - }
z: o! y$ p( X# T) [$ m3 A - return differ.size() == 0 ||! X, z+ T) G% i* d4 L6 ~
- (differ.size() == 2 &&
9 L: ~% _' a# N" @( {9 K5 x ~ - s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&
2 V. `3 H+ d; V# i - s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
! W) ?. A; g; b; i" @0 q3 E( w - );' I' R- E2 a3 j/ O
- }, n) r) ^% j2 I1 D0 {
- }
复制代码 # O1 A# C8 `+ D! h/ w# `( j9 ?
) T2 T; F# g9 X q3 t, `7 M9 ~# k
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {4 z6 @! G9 R( F8 J" z @; ^0 J/ s
- public int findCenter(int[][] edges) {
6 m* k0 M( q4 O1 n0 D - Set<Integer> set = new HashSet<>();
' y$ L8 n8 a7 N" m" @; L9 ~ - for (var edge : edges) {
2 D/ D9 ]1 a% p" Y8 Z - for (int e : edge) {
% w! I0 F2 p* q3 \5 ~/ u0 h - if (set.contains(e)) {
, C/ G2 ]1 c+ H$ G4 l - return e;8 A& t9 n3 a$ H+ z8 E6 X
- }
- \% U% r$ ?8 H+ Z$ ~9 G6 X - set.add(e);' W# t+ V y" w& W& J& d
- }
& G Y* v! D' E! [ - }
+ ~7 O/ I* D3 @, J. W - return -1;
7 t! Q+ F" b1 R1 f. n, Q1 _1 a2 k - }! W) b. B( h/ e
- }
复制代码 - P j9 q: b5 p3 [; F
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution { \1 i; r: A9 n/ b! |; _& U
- static class Class {2 y1 M( w' {* Y0 f4 f9 g+ v6 s
- int pass;
3 j+ [' ^& o4 I6 Z - int total;
$ y: d0 ?2 w# C+ b2 F0 ]5 h
$ n- w7 J6 {8 A- \' T/ |- public Class(int pass, int total) {
) X9 H) e+ o7 a2 t - this.pass = pass;
, ?$ D+ g. h% f - this.total = total;
% b0 P$ }. l! I- }0 K/ A4 r+ n - }
3 V8 }( ]7 q- q! w, u" C
; L+ h7 U$ N2 u1 f+ ~$ g- double differ() {7 m/ c" ^* i7 m: s5 L
- return (double) (pass + 1) / (total + 1) - (double) pass / total;
8 P9 H3 x6 v- u7 g - }/ e5 v9 e$ i! c# T+ ?
- }
0 c8 E L. E% v% e - , l: \' W# L. N) d2 ?
- public double maxAverageRatio(int[][] classes, int extraStudents) {
. ^! ?5 J4 l! \ _& N/ j - PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);6 K, ~" K& F5 }: T
- for (var c : classes) {
; I2 |, p. D% S, I - heap.add(new Class(c[0], c[1]));! O9 h' h. T9 |4 y5 F
- }7 D" c( ]8 h8 w" H
- for (int i = 0; i < extraStudents; i++) {
& |2 A% o$ f* k0 \4 v5 D - Class c = heap.poll();/ g% Y+ E/ K' v2 t
- heap.add(new Class(c.pass + 1, c.total + 1));
; M7 u+ C5 R/ i" G$ n+ H - }5 p" @/ w) l- ^! x7 F
- double sum = 0;
* }3 p% ~, J( B - while (!heap.isEmpty()) {7 D, P- |* @- i5 Q! v$ C
- Class c = heap.poll();5 i W% C$ s# r0 X! X* m& n
- sum += (double) c.pass / c.total;5 O0 x8 C. w- r! q
- }' o/ I, V* X6 T# j9 s& |: j
- return sum / classes.length;
3 V7 B8 f/ J- B; l s! x - }
i( H! U# @6 `/ ^% c6 [' p7 n - }
复制代码
/ x, x; H0 Y& l( a8 @) i" D No.4 好子数组的最大分数: }2 G- m4 p1 y, b- t( w
解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {0 Z7 J1 U; T& r7 A
- public int maximumScore(int[] nums, int k) {
# o( \' z' l1 K9 L1 u* c, E4 r( x - int[] heap = new int[nums.length + 5];
8 s# f& X/ W1 G - int top = 0;
. c: O1 B- Y# k2 |! O( C: u - int res = 0;
; e7 R3 j* \0 U, G' |1 s9 `. n/ D - for (int i = 0; i < nums.length; i++) {& D6 y8 q: S r! }% [
- while (top > 0 && nums[heap[top]] > nums[i]) {! }+ O8 R% }" a* F
- int right = i;
$ \) I! g9 H6 W3 g4 F - int left = top > 1 ? heap[top - 1] : -1;* C$ w6 T/ |# B) D
- if (left < k && right > k) {
9 A) ~ ^; _/ _- [, g7 o - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
7 V5 O; C( M9 s1 i2 a - }
. {7 V _" X+ F5 T# g - top--;! y! h6 J6 a/ D
- }" u( s7 N4 }6 @0 N& l( y& j
- heap[++top] = i;& a6 ], z2 w; H
- }: l3 I9 x$ C/ V: N% Z
- while (top > 0) {
6 h" S s7 i1 R - int right = nums.length;
6 q+ b' C- T2 o5 }$ Y - int left = top > 1 ? heap[top - 1] : -1;
( k) r2 e: S: ~" K0 `+ Y - if (left < k && right > k) {/ G( \! c7 O' q- B# h! Z+ Q7 @
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);
3 k f* h: o% ?" { - }
" u8 E/ ^9 p' Q: p5 a4 k* X/ j - top--;
- Z. l$ h5 H J+ g- Z8 U: w - }, b" { d. y5 w0 [( R+ ]6 O
- return res;" c: e0 Y( s3 }2 Z+ a, z
- }: ^+ y9 a* }" X% S% b
- }
复制代码 联系上岸小助手年糕,参与免费带刷# z: N* M6 a/ Z
|