本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 % L, I8 p' R% z% F' u. P; p
& n" A% B- i$ e+ j3 DNo.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {% N+ P4 P; _, u) U: m
- public boolean areAlmostEqual(String s1, String s2) {
2 _; P @$ v# M6 c- j; n* b0 l8 I - List<Integer> differ = new ArrayList<>();
. \& B$ H. h% T - for (int i = 0; i < s1.length(); i++) {, A% z/ J$ D) h" z8 o
- if (s1.charAt(i) != s2.charAt(i)) {! Q8 E7 S6 S: q" e- }6 q
- differ.add(i);; r {6 @2 v$ T
- }
- M# _8 g1 x% y) _$ n& e+ N0 J9 ^ - }" y' y ^7 e" b8 S2 G
- return differ.size() == 0 ||3 v8 Q9 O8 D: A! s( u
- (differ.size() == 2 &&6 M; C9 `! v0 a/ C3 Y$ Z
- s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&& o" d3 j7 o3 w, E
- s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
* ?7 |1 I& U* l! ^7 P' e - );) \4 T. W8 C4 K" I" H/ Z- p+ P
- }7 R$ s6 K0 A. v$ E: @1 A+ e
- }
复制代码
5 N. W/ p, b1 M- M+ K ! ]+ ~- Q/ ?% a$ U+ |, R& A
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {
$ F4 M( j# r4 @6 t9 \ - public int findCenter(int[][] edges) {
4 S9 I+ n+ w* F! Q - Set<Integer> set = new HashSet<>();
# J/ `( B. L+ u! s- N I - for (var edge : edges) {
; I4 Y# j# h0 Y - for (int e : edge) {
9 m$ Z9 n1 _) H2 d - if (set.contains(e)) {! [7 I; G. s+ n3 r
- return e;
) T3 M, x) @& A B7 I6 C - }' i; ?* G0 M0 K8 X, Y3 O4 C9 t
- set.add(e);6 Y: f! y# ]- z D4 M, {
- }5 r& j( M' @& J; e# [7 y. l
- }
: A% [% _7 q8 s& z( ~4 a0 j+ O5 |2 w - return -1;
' {9 |7 R/ p8 b) h* v+ Z - }3 A3 K1 [, a2 T$ @8 r! r) s
- }
复制代码 , E0 |9 `% \ ^6 U. s$ i
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {
: `+ ~+ m8 @" N- d1 H& {5 F2 Y1 B1 E - static class Class {
2 S6 o' P& X" |$ m - int pass;: n8 M* k9 ~+ s5 j% K1 K
- int total;: w! J! O! Q. n6 A$ t+ }
- 5 v% O. ?5 f3 ?* J i
- public Class(int pass, int total) {
, k' g* F7 R) S - this.pass = pass;9 N% H6 v% D1 D6 T4 k c
- this.total = total;2 v9 P7 n7 L0 B: w$ B
- }
v1 o! z) [% v7 N I - 0 R& g+ r0 N" B# y9 v, {
- double differ() {
7 ~& O. D! X3 F. w4 _8 _3 V& [0 ~ - return (double) (pass + 1) / (total + 1) - (double) pass / total;
0 Q6 C. C4 O+ ?& v# e! N3 Y - }
- K8 e4 F* r1 j; f& F) J) N - }( o" W( A. S% d( j6 }
! a' O: L5 E% E* g+ F w- public double maxAverageRatio(int[][] classes, int extraStudents) {$ g- g6 a* K3 {2 o0 n5 s
- PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
6 T" v; ` m t3 O - for (var c : classes) {
4 x. {) C7 T8 e/ e# u ]( P6 B: Y - heap.add(new Class(c[0], c[1]));% a1 s7 R1 T$ g9 e& ~6 P
- }
7 U- T* o% F; A9 A5 d - for (int i = 0; i < extraStudents; i++) {
' ~# I' _) U, g( | - Class c = heap.poll();6 p8 g$ m. Y; I$ d) {
- heap.add(new Class(c.pass + 1, c.total + 1));
8 A. Z" C. \9 r% N$ x, n% x5 L - }4 k! z4 _. M! s$ H
- double sum = 0;+ Y* f' @$ _! M e6 q
- while (!heap.isEmpty()) {* ?5 X! |4 d8 f
- Class c = heap.poll();
9 f, w5 F) e( u R- E - sum += (double) c.pass / c.total;
3 I" m, a v! l% i$ e - }
( `0 [$ x7 F3 u: K1 x/ a# ~ - return sum / classes.length;# |8 {) ^0 r. s$ l) d
- }
7 }7 J# O) Q6 F0 Q. D5 L( n - }
复制代码
3 ~: Q& c* V, A/ _% K( b No.4 好子数组的最大分数7 y0 m3 }. k; J8 f/ h3 b; _! m4 I0 ?
解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {
9 @ N R$ {' l' q- E- P8 X - public int maximumScore(int[] nums, int k) {
/ C& d( F6 c( `% A! ]7 x- L; ^% h - int[] heap = new int[nums.length + 5];
5 w$ v( R: M! h - int top = 0;. U/ U; R. e1 q* M# N
- int res = 0;0 E* y8 H W& U6 X' w1 c! i3 ~& e2 S
- for (int i = 0; i < nums.length; i++) {
5 B$ k/ U$ o4 ~; p _; w, ]9 P - while (top > 0 && nums[heap[top]] > nums[i]) {% t* x) b% k) S' G. |
- int right = i;
' C, L A8 \' u: P, E - int left = top > 1 ? heap[top - 1] : -1;% s# g, E1 I7 @8 b3 W* l0 B& W
- if (left < k && right > k) {0 ]' f8 [8 p3 o& _2 Z$ N
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);3 T) w* p+ @5 ]$ `: U% }& x6 l! }
- }1 @8 p$ @" V. C5 z; x* U0 Q
- top--;) _/ {# y6 `+ c2 `/ i
- }$ z: b- k4 M1 d5 u3 U
- heap[++top] = i;
' f0 o1 @7 G& B5 K, X4 W - }& h. p0 ?, w2 E# N& R" Y2 @/ ^
- while (top > 0) {& ^ D+ J9 `7 q" d! c4 l
- int right = nums.length;& D$ ?, ^* v6 K* Q4 j% H: \; U9 m6 j! X
- int left = top > 1 ? heap[top - 1] : -1;1 u* L5 m7 ]; P
- if (left < k && right > k) {
) P8 O1 n2 B0 b- C7 F, d - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
: j2 I" y& z0 i& k; y: K - }
+ Y o9 ^' v/ [8 A - top--;
$ \! g. [3 ^" T$ n - }! L$ w9 g3 ]. M+ [: I- @) h- \; a
- return res;
: [. ]/ s8 j8 h: h% s - }4 B3 m- s& p0 v; B
- }
复制代码 联系上岸小助手年糕,参与免费带刷
5 i& {3 |+ m- Z1 U6 ^ |