本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 3 M! H H( N. r- B: [
" H/ h# Y( }/ F: b m! NNo.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {: m3 y: ]- K7 o. J5 V) r+ P9 q
- public boolean areAlmostEqual(String s1, String s2) {
9 Y9 @9 a2 P3 d* ^& e - List<Integer> differ = new ArrayList<>();
' {" w. R- i" E1 V* f - for (int i = 0; i < s1.length(); i++) {& _* f! U; K$ ?
- if (s1.charAt(i) != s2.charAt(i)) {% ~5 l" }' `; {) @
- differ.add(i);
: w0 \0 ]" [ v8 I- o! B( K - }
$ b3 d" \5 h( n, S - }
( V# D$ r* g6 d0 y* _6 g& }, z - return differ.size() == 0 ||+ V1 D) f+ ^* R# \& A8 ]
- (differ.size() == 2 &&3 ~! B: r; E! x! v3 |! }2 I
- s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&7 y8 s: t* ^* a$ q$ E, k
- s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))7 f5 u Z6 p" I7 @
- );
$ D6 a2 x& b* W6 I; t# E5 j* F - }% i0 H6 z; c. p: t) ]$ }
- }
复制代码
/ c" {3 u" h/ ?. i) K9 K
5 a5 d4 e7 k2 dNo.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {
; y3 r' `3 C% N7 L3 m - public int findCenter(int[][] edges) {
3 t9 o2 K, b' N! l# ?5 W) c - Set<Integer> set = new HashSet<>();2 ~/ p9 H+ P" U1 ?. V. C) H8 E# z
- for (var edge : edges) {6 X3 b, {) _2 }: C
- for (int e : edge) {, f: |6 k4 M5 _+ u/ W5 L
- if (set.contains(e)) {
: N! y1 B# U2 E: G& r9 I* X - return e;
+ o$ d, B- b4 w+ Z4 o8 w0 n: @0 e - }
* a3 D4 @' J( F& u6 ?' U4 ^: y% u9 p - set.add(e);
. s5 E T; q8 [" c$ P. N - }1 ]. Y% ?9 P: F. o6 K
- }! O+ f3 g$ j6 [* m Y; w' t0 j+ {
- return -1;
0 z6 |. Y( K4 _5 S# W2 q' k - }
d) g1 n8 b5 O+ y - }
复制代码 ( u! M5 N( {6 t O
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {
, a5 g0 h F7 }5 Y. Z - static class Class {
* X+ E# d0 s. N. Q" ^& `# p - int pass;) n; Y/ J( b# A
- int total;+ n/ c+ h7 }6 o2 O1 C4 l& l" g
- / q' h: e, p& Y( l3 C0 M' L
- public Class(int pass, int total) {# @. X* I8 r. t. A
- this.pass = pass;( s! U! K% ^2 p4 o+ ~$ ?
- this.total = total;
' X1 I% X# [4 o8 d& [1 a" i9 _ - }
9 h# z. J5 r0 n0 v
. @; o0 z+ R0 v- [: y0 w- double differ() {& _# P4 B) m& h( @8 \ v2 o- z
- return (double) (pass + 1) / (total + 1) - (double) pass / total;0 L# ]1 p& f3 W- f% w
- }4 S, w# G; r n F! U$ y
- }
) I3 X, `2 x1 n+ d/ Q - : }& V' A, n7 c! U6 N
- public double maxAverageRatio(int[][] classes, int extraStudents) {+ W. G( s6 V" q6 ?6 `
- PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);( a* z) z2 C2 u0 P- w5 B$ X. \
- for (var c : classes) {
4 S2 O! F# M4 P5 d$ f) m$ I - heap.add(new Class(c[0], c[1]));: A2 ?3 r+ f& R' l0 t' }- B
- }
( Y: h2 W; n5 a, Z- I7 } - for (int i = 0; i < extraStudents; i++) {
5 j# B& ~2 r# Q" L' Y6 L - Class c = heap.poll();5 n* [5 Y6 l" {/ a) C- f3 o. }
- heap.add(new Class(c.pass + 1, c.total + 1));; Z; l8 r6 `8 P3 A- u/ x
- }
5 Z# u. J+ @& P" A$ g- V/ Z - double sum = 0;8 x7 J% U7 y& u% y% X
- while (!heap.isEmpty()) {
. R9 r( ^ u! E( X - Class c = heap.poll();7 j. w5 ?4 f3 U4 i5 Q' q0 ^5 F
- sum += (double) c.pass / c.total;3 M2 K: E3 O, v7 w* j' W- J
- }
. e" o/ m/ y# e - return sum / classes.length;
& P0 e4 @- F( {0 H' G - }# w# _! K. n6 N9 o1 l
- }
复制代码 & i9 K4 X, c- g/ @% @
No.4 好子数组的最大分数4 a4 m1 p5 W$ q- S( e
解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {! n3 R0 `7 a. o/ L6 q, Z
- public int maximumScore(int[] nums, int k) {
- ]4 M( w% n/ g- F) ?# k0 n - int[] heap = new int[nums.length + 5];0 ^$ ^% A# n8 d' _- X7 h
- int top = 0;
% G3 T5 m: ~. h) ?0 k' K4 O - int res = 0;* O+ @( b0 ]7 H# \. A/ P' S( F
- for (int i = 0; i < nums.length; i++) {
) f6 M1 ~9 B" \ - while (top > 0 && nums[heap[top]] > nums[i]) {% B! }2 R+ o. K+ C
- int right = i;
1 R2 h" X4 t# \2 G - int left = top > 1 ? heap[top - 1] : -1;5 \- n4 j1 G1 ]4 w8 [( ~
- if (left < k && right > k) {
7 q$ U, W1 k! ]: X" t - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
7 j/ r3 z" p/ B9 e - }7 d3 ^' _* B5 w% u6 M. h. R
- top--;) \5 g; e9 X' h# l
- }! l" A' J( m o" u
- heap[++top] = i;
/ v+ I% M: [9 c4 K2 ~2 U9 o2 C, q - }1 [& r" K) l, I; h3 n- {9 s
- while (top > 0) {
8 a! E4 g+ c" a4 G - int right = nums.length; u1 S' X! l6 s1 J$ \5 a4 Z5 Y n5 q
- int left = top > 1 ? heap[top - 1] : -1;( O$ X/ ]$ u" y4 N+ T% I0 H D
- if (left < k && right > k) {
" z9 q- v! [; s# q" M# @8 V+ O - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
0 c7 I; h3 J. l! r( f - }) d1 \( e' j( p; _9 T3 b
- top--;4 x0 }, L+ Q9 O
- }7 _, }' I0 [1 Q$ r0 s
- return res;
4 E5 o( b1 @/ J, C. D( z( W - }: z" ]1 M9 ?0 m8 X) h2 a: p
- }
复制代码 联系上岸小助手年糕,参与免费带刷
+ ^4 O: h7 b) A- M: X. f+ a3 u |