本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 8 o5 k" M3 y8 k* E' `" P
, A$ h, h" I5 V) t. W. C- nNo.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {
. I* Y+ i$ f; c! J: k: V - public boolean areAlmostEqual(String s1, String s2) {
9 v# Y+ J1 X% X1 Y3 L7 n& [' t - List<Integer> differ = new ArrayList<>();1 {9 f4 H6 G- B' i) p# z
- for (int i = 0; i < s1.length(); i++) {
7 l6 v6 P1 q3 ^) k - if (s1.charAt(i) != s2.charAt(i)) {" A& [9 W2 V: i& M7 }
- differ.add(i);% c% Z* t4 _* J/ C$ K* E
- }
* M, b* o2 o1 J$ ^3 ~; f1 p - }. a, ~$ c9 L O4 f) T7 d
- return differ.size() == 0 ||
# k+ j/ \. k! B, r - (differ.size() == 2 &&
* |: U; s n# M# M# e9 v( B - s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&3 z; u, y2 q L2 p
- s1.charAt(differ.get(1)) == s2.charAt(differ.get(0)), O: Y) e" b0 q/ |7 _$ C
- );# Z+ J0 e4 q3 p+ H: W6 m
- }- T& Q" T9 A: g6 O; D6 ]
- }
复制代码 6 C y, W, }+ g9 o& C, Y
- E( h2 ?+ I! R& A$ L) e% |
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {- j, z+ \' |, V" k
- public int findCenter(int[][] edges) {
- \# s0 g& ^( R% v- x1 a: g& Z2 H4 `) a - Set<Integer> set = new HashSet<>();
3 n4 f9 p/ B5 j7 ?7 } - for (var edge : edges) {3 R. S/ }6 k4 O; _4 {6 }
- for (int e : edge) {
: W1 h; l7 t4 H [9 t- s/ P! ~ - if (set.contains(e)) {
: ]$ |8 ]3 T8 x- q - return e;& _0 d" y5 [% P4 [' N. m" V
- }
u9 B c0 Q: h2 m; ~$ ?/ U, _ - set.add(e);- F) b# Z5 u5 Z' b6 C8 z; k
- }% f, x d: Z+ a0 t. M
- }
. E6 {& V5 x9 m" i - return -1;$ ]( y! Z, D5 p# x! [7 t y
- }
9 c4 i) u* d! L& v7 j" i - }
复制代码 , a6 k) O; H4 g# p. P
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {" f3 M/ d3 C" Z
- static class Class {; h. T3 \* L& v9 K# ~* M
- int pass;/ c7 ]1 H2 n, d0 l" d- j; I" j( } T# C
- int total;
; R8 q$ F# s ^" A8 e/ \ - " \( _% U- B; n3 Q( `, n* H
- public Class(int pass, int total) {1 G" `+ a9 T' D8 g
- this.pass = pass;& ^9 m) F5 O I6 T
- this.total = total;, e: O" v- \, g: u- _9 G' ^
- }
, ]6 E3 ? |+ W% m' `0 V0 D5 U4 x - ; \/ W, v$ p5 `) Q2 Y
- double differ() {0 R8 c7 X$ y( @+ Y' U) i/ z" D
- return (double) (pass + 1) / (total + 1) - (double) pass / total;$ ~* v* ]/ q1 z2 W8 d' l& B
- }
x7 U7 x( H# D$ K' n - }
5 g2 [2 }# r; `/ g
: g: b- z: X8 L$ ]! s- public double maxAverageRatio(int[][] classes, int extraStudents) {2 [0 m1 R. {! [) ? _1 s
- PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);. {( l- {' {% G q: o" A
- for (var c : classes) {
6 U5 F e. O5 y) V - heap.add(new Class(c[0], c[1]));7 y$ q w+ S9 @4 f
- }7 w" \+ q5 |" [$ ]2 N( x2 j) ~. f
- for (int i = 0; i < extraStudents; i++) {: V3 g7 }- E% P- [/ T# K5 a6 L
- Class c = heap.poll();: U$ T0 y! E7 C
- heap.add(new Class(c.pass + 1, c.total + 1));7 O5 ^6 G% [, ]0 c
- }. [; T: P0 _4 E9 e% x. @2 Z
- double sum = 0;
. e. ]: I% S9 x - while (!heap.isEmpty()) {
) E% c# ?2 y1 x; s# t - Class c = heap.poll();
# M2 o1 Z9 ]0 V' X/ x- F) L - sum += (double) c.pass / c.total;
9 m2 z/ m# |. J9 p3 ~; v - }9 `; x& D9 X( N0 F
- return sum / classes.length;
- l- @0 M: [6 y. G f - }
4 N: o& P, }2 i+ C; p) {" X - }
复制代码 / Z. l# Y& O4 {' i4 m
No.4 好子数组的最大分数: F# @$ V4 y6 ?8 Y0 s' d$ Y+ @1 K0 s3 {) d
解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {
1 p6 B4 b1 ], V - public int maximumScore(int[] nums, int k) {
3 I8 }3 Q. S0 Z2 u - int[] heap = new int[nums.length + 5];
- w- k: K( M* ]% v; h - int top = 0;
6 M) v0 M: c0 k: f P: h5 w8 a - int res = 0;6 {5 i- @+ i1 ?/ D, H
- for (int i = 0; i < nums.length; i++) {
% K. f+ M5 c; \2 i# t% r" N - while (top > 0 && nums[heap[top]] > nums[i]) {
$ r/ t) c2 X1 C - int right = i;
T; U( o/ z% X) e u - int left = top > 1 ? heap[top - 1] : -1;
7 I/ q3 v$ R; t9 b% s0 X6 v$ u - if (left < k && right > k) {( Q% z E: u, ^' n- b; I; i
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);
3 T, J* K0 Y: [! ~; G2 w' h; a - }
5 s, M8 J3 ^7 j7 [) D, c6 N/ s - top--;
" m7 [# G) ^+ A, D - }8 y" {9 W$ G9 e" t
- heap[++top] = i;3 y, ^. C; q, a4 K% d$ l
- }
+ Q9 u7 g, {: B* G - while (top > 0) {
q# W" F1 H$ q; ~' U1 Z* ?- c - int right = nums.length;
: T% t; P9 g* ?0 I4 O' b: w5 N' Q; C - int left = top > 1 ? heap[top - 1] : -1;
& y5 C- X/ p) E3 U: ?4 {% @: G - if (left < k && right > k) {
7 K: f" j+ q" }' G2 k - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
: c6 F2 k u) [1 `+ u) K - } J' Z2 R- j9 j: k' m/ T6 A& Q
- top--;
- ~/ {3 S! j8 Z3 N: r; ]$ S - }
9 D/ j# t3 r! x - return res;
5 x7 u! J* L4 q - }# C9 {, t+ k' c7 c1 {% m' j) Z
- }
复制代码 联系上岸小助手年糕,参与免费带刷
# k6 W2 M$ ~9 V# u |