本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 ! J6 K5 Q* {/ h9 a8 w, ]! [0 z+ [
/ f n) O1 H- ~: {+ {$ Q* W
No.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {( G! `+ e( B8 Q
- public boolean areAlmostEqual(String s1, String s2) {
2 N0 K E* l! V7 T, \ - List<Integer> differ = new ArrayList<>();
8 R; _ h% c5 Q7 g7 n; j - for (int i = 0; i < s1.length(); i++) {- ^8 f3 b0 G" d. u4 [
- if (s1.charAt(i) != s2.charAt(i)) {
2 _7 g! d# L4 K - differ.add(i);3 R* C" t' |. G' W1 G. ^: [3 D! V% ^
- }: T, w" `2 [6 x! a4 N6 u
- }* w& Z: Y& p: f5 p3 C
- return differ.size() == 0 ||
# ]5 y8 N$ [4 _/ l$ e" O9 M - (differ.size() == 2 &&. F$ k1 J, o( Q- |+ f* s
- s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&; O. J4 Y4 [# m a
- s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))! y5 V1 W5 j4 h; M
- );
4 b; W+ c% C0 P) c& l1 l! K - }
, q9 r8 `6 \1 z6 e - }
复制代码 ! W9 F* A" i& }) X
9 z4 x, u$ K$ A5 m( G
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {
( I5 Y; K/ U5 Z9 L% }5 Q3 u - public int findCenter(int[][] edges) {
1 S1 |9 J5 g1 E9 ~% c k - Set<Integer> set = new HashSet<>();8 n1 Q1 `7 K9 |8 s3 X/ W0 [
- for (var edge : edges) {
, Z* ~7 K6 _2 C5 A- X# L - for (int e : edge) {
) _1 Y: p* R4 q% J - if (set.contains(e)) {
- z# \& o9 A7 U3 L0 B1 ~ - return e;& e# I- _$ y$ x% P2 S- I
- }7 ]5 C" Z$ c7 ^5 F+ @
- set.add(e);3 v" \ ]+ C, B+ P- x
- }
# E/ V2 E- I$ [: N" _ - }4 b7 v! i6 Z, n
- return -1;
" }3 W5 d2 f: W - }7 X5 A; ]% }; M
- }
复制代码
" c9 f) n6 D% J, O+ m2 CNo.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {$ C: p Z+ q. k% |6 b+ v1 o
- static class Class {6 F# l" B/ P& J" _! H: s
- int pass;0 J7 u6 t, y8 j, G2 a4 \; x x
- int total;5 q: x7 p% R. C% d
- [2 E: T2 z4 x1 M
- public Class(int pass, int total) {5 |5 `, W3 i9 X" P. ~, G
- this.pass = pass;/ E, Z+ v; F) e2 T9 I
- this.total = total;: X7 O/ _3 ^% L" a: M: G2 H
- }
0 h1 H1 T0 u5 V! q - : G! J( d8 R$ N. U! k
- double differ() {1 o0 u2 z% X: L: _, {4 s9 p
- return (double) (pass + 1) / (total + 1) - (double) pass / total;8 `: [( Y4 T" t
- }1 z4 M1 a& V6 H7 N
- }
; a; @# F/ ?( x* s% e; M+ M$ r - 4 m& a3 M# M; ?8 ?; c1 |- r( t
- public double maxAverageRatio(int[][] classes, int extraStudents) {
3 K9 }" k+ z8 R& {# | - PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);* I8 D# B+ L+ S4 ]
- for (var c : classes) {. J F$ R5 n$ y( T# m; ^" Q N
- heap.add(new Class(c[0], c[1]));
4 m% C( E. W- g1 l' l - }
: ?9 y; d, T( z. x6 U3 n- b) X - for (int i = 0; i < extraStudents; i++) {
) v) ]# M. |- N# S j) `( s1 d - Class c = heap.poll();% z, ?. b5 n" B1 x
- heap.add(new Class(c.pass + 1, c.total + 1));
+ W x' t; Q% ]/ L' o$ D0 m - }
% V0 t: X$ r {& [# b# r6 A - double sum = 0;
1 u! y& K1 e& b! [* f/ w5 b - while (!heap.isEmpty()) {1 |! B# q4 Q- A! j0 w/ g: j6 S1 ]
- Class c = heap.poll();
' f" c' H2 Y7 B0 ` c) u - sum += (double) c.pass / c.total;
$ H# W' N* e5 D' u* g/ J H# ^+ X - }
& n4 b! E7 W R. l) c) d - return sum / classes.length;
% l2 x4 y5 s2 x. W; W/ H1 G - }
) s$ _9 q& u. N2 V; g - }
复制代码 + `& ^8 |( v4 d, u9 Y! @
No.4 好子数组的最大分数
9 z$ ?; c3 N( E1 T' S4 O解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {
( F" J0 ?1 x: O1 r+ P0 z. f - public int maximumScore(int[] nums, int k) {! |. j' ?& S- p% z7 t) w
- int[] heap = new int[nums.length + 5];
4 Z* V- \) o4 I - int top = 0;
2 O$ d9 c* U4 w - int res = 0;6 X2 T) Z2 \7 }; L3 o& x
- for (int i = 0; i < nums.length; i++) {& j! x7 \& |6 }! z0 |: q& \3 X
- while (top > 0 && nums[heap[top]] > nums[i]) {
8 |0 v6 O* {4 y) ~/ Q1 q# H# X2 a - int right = i;% \& N i% A1 T! a
- int left = top > 1 ? heap[top - 1] : -1;
; f( l* `4 e6 F$ k0 ]; E - if (left < k && right > k) {
' `( G5 X% E2 E9 Z2 M3 M - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
; ^6 k! L- T, {$ ] - }
7 c+ k7 x0 A( g( b" T - top--;
8 y; o6 w% M+ O7 D' N - }- G! Y0 F* n2 m! l# a1 d# U+ m
- heap[++top] = i;
# P6 X) a( O# s- ~+ y% o! [. m - }7 g) i5 D2 a+ i5 C3 z" [% j" }- Y
- while (top > 0) {. d: q, G9 _7 x, \- _
- int right = nums.length;/ J+ h* L5 Y [( a; c
- int left = top > 1 ? heap[top - 1] : -1;* ?1 ^" T. D, N6 }
- if (left < k && right > k) {4 @1 U. H5 i4 T' O
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);
$ |: |0 x: p- U, ~* o. r$ R - }6 M' l' Z0 Z$ x" j+ \& B4 T
- top--;% _7 ]8 p, F/ t. v0 r( S$ Y
- }2 ~$ O$ |7 U/ R# _, b; V
- return res;0 r* V# |0 p W7 J, z' i7 D
- }. \) w1 G: m! q$ `
- }
复制代码 联系上岸小助手年糕,参与免费带刷
; m& \. l9 H; \2 r, `/ i |