本帖最后由 上岸算法 于 2021-3-17 08:30 编辑
3 e; g) y; Q9 R
9 Q, f) J) G; c6 A3 ~No.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {+ [7 j9 `- N- p% f5 }3 X
- public boolean areAlmostEqual(String s1, String s2) {
4 d9 V* X$ o5 S& ^5 y( w/ k - List<Integer> differ = new ArrayList<>();9 [/ k5 [4 Y" R/ I1 z8 p, Y" I
- for (int i = 0; i < s1.length(); i++) {
c, g& n1 P( ^8 b+ x( r7 t. Z4 d - if (s1.charAt(i) != s2.charAt(i)) {1 \: j+ w# i1 L
- differ.add(i);
6 u, ]) Y4 A; R: q( V. g9 Q0 [2 M - }: h, X) X' B0 R6 t0 G: V) K! m
- }0 R$ ~1 J/ b7 T* ~3 f) y2 E* z
- return differ.size() == 0 ||
# G1 Y9 k5 p- C - (differ.size() == 2 &&% I% x$ t6 |* Y
- s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&& P' ]. @ z9 v; H/ v
- s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
8 K& t6 G/ S# E& } - );
2 c' o' O2 D# [/ B# d: ? - }2 ?& d4 ^# X/ z+ W3 e* Y \
- }
复制代码 p; w7 z$ K9 e
1 P1 _8 a/ Q& ]( \$ f; A9 w5 f
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {: [# A" _# b3 p4 i+ m" Z. q
- public int findCenter(int[][] edges) {
0 N% w+ ~$ l h3 W k& K/ t - Set<Integer> set = new HashSet<>();0 n9 X. k( F% ]& P4 j3 E" h
- for (var edge : edges) {; f! ^! @+ u- l0 t
- for (int e : edge) {5 D- F- L% [( `. @. h% s. J+ \
- if (set.contains(e)) {, c0 O* }* P# b
- return e;# F* [, {. M8 `; i8 b& w
- }
( s; k/ {3 u: M! i- B d - set.add(e);7 Q- L+ D7 u3 @& s/ A+ r
- }! K# \7 e7 b7 }, B. C- m
- }
7 V5 z6 Y: z3 @8 V1 w% i( h - return -1;0 D- V, d/ m5 F4 w+ ^& k
- }
% S8 U, f% o/ y/ m3 R - }
复制代码 5 B1 }" [7 e' ^7 `/ Z+ ]
No.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {
" E3 c5 c9 j' b! | - static class Class {$ b' X" J7 R7 E6 u3 l
- int pass;
# ^( p7 B2 P3 C0 \0 n - int total;
0 F8 ]3 }0 T1 U3 `6 `; n M
6 s4 E+ p% ?( K0 q( i9 Q+ o- public Class(int pass, int total) {
# O0 J- R8 A2 A9 e) W ~* z - this.pass = pass; A2 V/ M# U5 w# u y9 \
- this.total = total;/ q: L U' @1 A' Y9 e
- }% @" W* @6 U% y0 P& ^3 X$ h k6 X
- . q( k; D B" f
- double differ() {! z8 a3 v& [) p% g7 ^
- return (double) (pass + 1) / (total + 1) - (double) pass / total;8 E+ I4 {/ C6 U
- }
3 \" V! ~2 ^) ]$ w( v - }: C# i5 R) v' m; Z2 w
- 4 w. s$ Y- g" H; v1 }* S @ k
- public double maxAverageRatio(int[][] classes, int extraStudents) {
; v9 U, ~$ b$ S4 v3 L- d1 ? - PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
+ k( `6 d' ]! d8 U% S* V4 g6 o - for (var c : classes) {3 I( n! n2 H& |: h
- heap.add(new Class(c[0], c[1]));0 Y& C( D& Q, b2 G- b
- }
5 i% W! x- Q0 S1 A - for (int i = 0; i < extraStudents; i++) {
5 o$ t7 s! Z6 q& q - Class c = heap.poll();
8 }" `7 F% B1 L; v, W - heap.add(new Class(c.pass + 1, c.total + 1));: t" F5 r0 X1 B2 V+ n( Y# ?
- }9 j+ b1 ?9 n! S* t
- double sum = 0;) }1 z% u7 N+ E$ H8 O: ]
- while (!heap.isEmpty()) {
: G* z, \4 d; o( c) E& b0 e - Class c = heap.poll();
% T. v& T6 v" j. L* a# z0 J6 w - sum += (double) c.pass / c.total;" y) Y+ P: W$ S' n, j& [
- }
" O6 T% J+ d# ~& P - return sum / classes.length;$ U# T( {( f. o9 R% Y8 L8 ]; L' B" f
- }" d3 j- a' l0 D8 \" B2 C
- }
复制代码
( o; j7 }- {: M7 W No.4 好子数组的最大分数( n8 ^) p6 N1 G1 n2 o; G
解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {
" q8 B) `$ a+ k! ^" T# S - public int maximumScore(int[] nums, int k) { @# H6 b; d. b' N
- int[] heap = new int[nums.length + 5];1 l& [! d- u& C, G$ c8 j; I+ y
- int top = 0;# I3 n* h2 |! E; ~) C. L& {
- int res = 0;
4 R( d# z; o4 [) ~ - for (int i = 0; i < nums.length; i++) {+ {3 t" e. g" n4 G
- while (top > 0 && nums[heap[top]] > nums[i]) {; ~ E# E- c1 T: x$ Y4 S0 x
- int right = i;* q: Y* o1 Y# d; K) r ]
- int left = top > 1 ? heap[top - 1] : -1;
- X0 K- y I1 ?8 p B, ^2 N - if (left < k && right > k) {
v* }& n: g) x2 t - res = Math.max(res, (right - left - 1) * nums[heap[top]]);/ ]8 L( ~' ?9 L8 {$ G1 r
- }3 j' l- J* F4 o) B- E
- top--;0 L3 D) d; v, W' c
- }' `' N; i! S9 y3 m% r1 |
- heap[++top] = i;+ Y+ | u: Z: k8 V" U* R
- }
- J6 V: g! N- _ - while (top > 0) {
% Z4 F9 x& k. L& `* m: M/ a - int right = nums.length;0 a1 Z; P7 [; R
- int left = top > 1 ? heap[top - 1] : -1;1 W& r- j' _; h O% Z1 F; |
- if (left < k && right > k) {! W- n5 O% r Q. y6 T( R# g5 @8 P3 u
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);
! f6 W2 i6 H8 b: ] - }
. l! J+ p) m: ]' R8 }* ?4 G- D' \$ y - top--;
( K# a) C% f3 D6 A+ n - }
* l3 E( }' P6 R - return res;
9 y% v7 h v' q! V/ Z$ p - }: `4 z7 ~4 `: ]9 Q2 k5 ~
- }
复制代码 联系上岸小助手年糕,参与免费带刷
( Z6 {* p( P( l4 c+ D |