本帖最后由 上岸算法 于 2021-3-17 08:30 编辑 ' g. l% ]( w1 P1 e6 \# S |# B$ x
* O0 k3 B6 C; }' C
No.1 仅执行一次字符串交换能否使两个字符串相等 解题思路 签到题,枚举一遍统计出所有不想等的位置。 代码展示 - class Solution {
. j5 R: v. J1 f9 d9 Z$ h, w# _! ?, I - public boolean areAlmostEqual(String s1, String s2) {" {) x. w% q5 Z+ t+ n
- List<Integer> differ = new ArrayList<>();
) l7 j( G1 _1 y; Y% v1 X0 o m1 ]- l - for (int i = 0; i < s1.length(); i++) {9 ^5 |: i$ u0 Q9 O
- if (s1.charAt(i) != s2.charAt(i)) {
: w( Y Q4 F9 x2 H2 H0 o - differ.add(i);5 s+ L% f& f4 D3 F3 f) o1 _
- }6 ?! R9 B; i; J4 n- Z5 H2 b
- }& L2 e3 `! I( T7 g- @5 i) X
- return differ.size() == 0 ||7 f0 g# B% m d0 p {
- (differ.size() == 2 &&
4 e X2 j: F, i5 N - s1.charAt(differ.get(0)) == s2.charAt(differ.get(1)) &&
$ i% J2 n. D1 b( H* k0 p - s1.charAt(differ.get(1)) == s2.charAt(differ.get(0))
; X' A8 Q. q1 B - );
9 H% n8 z0 p+ o7 }( Q - }: y/ ~" h& r0 }+ E! j! N: p& P
- }
复制代码 6 r2 R. C! l# J4 V6 ?" {' Q
, F: g+ [+ H' H4 d1 Z3 S
No.2 找出星型图的中心节点 解题思路 n 个点 n - 1 条边必然是树。因为是星型图,所以叶子结点的度数均为 1. 只要一个节点在边中出现了两次以上,它必然是中心节点。 代码展示 - class Solution {
* s U) S; ?; m' D7 i+ |6 S. n7 C - public int findCenter(int[][] edges) {
& Z: i, l0 e: t" |( I - Set<Integer> set = new HashSet<>();
/ e* [2 {# G0 i- z4 z; c" h - for (var edge : edges) {2 {1 ?+ d0 W w5 h2 }
- for (int e : edge) {
6 H* @9 [3 m, m0 o - if (set.contains(e)) {
! v3 W% h$ n5 D5 A n4 Y - return e;
; `; M. ?, S' e1 U0 S - }2 a9 Q0 f' i0 N! V B1 Y3 E6 E
- set.add(e);% r5 U) j) }$ p$ i# Y: q
- }- e* F( _6 K- O8 @0 i
- }
8 e$ P" }3 ?1 G+ E( V - return -1;; i+ h; U4 i% U; @4 M5 d$ n0 X
- }4 Q4 `. ?" d9 l0 g! f) D( ~
- }
复制代码
1 }& w' g. g- w# oNo.3 最大平均通过率 解题思路 贪心,每次放一个学生进入某一个班级,进入能提升通过率提升地最多的那个班级。 代码展示 - class Solution {
' z! O5 E& U* |$ C - static class Class {/ [* r) `5 q0 l; e3 b. {8 o
- int pass;8 f; s) ?( g! s ^ E+ S% N& [
- int total;
0 i" W& g4 T% j, u8 W4 r
+ f+ e- n3 ^' f Y& f- public Class(int pass, int total) {+ z8 n/ `0 n% y$ ^
- this.pass = pass;
5 E3 e A* |4 `: U6 A# X. v - this.total = total;4 n W$ d$ l% \1 a/ l+ E0 C" n- T
- }. T/ e e' c4 y" b! p+ \0 Z. W: N Q" B
( }" `& M; N2 W4 t6 I- double differ() {
. ]9 e$ I) }( W& F - return (double) (pass + 1) / (total + 1) - (double) pass / total;5 w: W) M; f$ h
- }
* B7 `6 k: G% r' r - }& i2 H8 t$ Y" d$ T* @
+ h: L4 i& D, g) n, K- public double maxAverageRatio(int[][] classes, int extraStudents) {
3 n5 s! F J; H1 P - PriorityQueue<Class> heap = new PriorityQueue<>((c1, c2) -> c1.differ() > c2.differ() ? -1 : 1);
$ J1 c! ^- H' c9 A2 f: s - for (var c : classes) {
7 ]5 x7 K$ R, r+ E1 S - heap.add(new Class(c[0], c[1]));" I% \$ q# q/ c( D; S8 x6 H+ `
- }! u' I: ^& V: G0 A# ]# f
- for (int i = 0; i < extraStudents; i++) {/ M5 M% ~7 ]) p& n& s% Y# u
- Class c = heap.poll();: x" o; B: t. X; m. g6 `9 v
- heap.add(new Class(c.pass + 1, c.total + 1));6 k! W7 j2 E) G9 ]* q, s
- }, v* r g4 m6 v( J" A
- double sum = 0;
( S- W# ]2 m( L8 y6 e, E' g( g7 y" D - while (!heap.isEmpty()) {
' d- M9 z- M- ?+ ~) o% V9 N - Class c = heap.poll();
: c) u/ Y, Q' Y' j q - sum += (double) c.pass / c.total;( L, ?% F* T/ O8 d
- }
% ~2 u, |6 _+ w3 P1 H$ g* [( Q" e - return sum / classes.length;
1 [' Y2 y1 {4 v! \ - }( A$ I! e% A" E7 A! i' ~
- }
复制代码 , W+ d' a3 H2 k" O% R
No.4 好子数组的最大分数
7 c" Q/ ]" J) `解题思路 单调栈,与最大柱状图类似,找到一个值的左右侧第一个比它小的即可。 代码展示 - class Solution {: i5 T- P0 p' ]3 g, y, U4 @$ l
- public int maximumScore(int[] nums, int k) {
6 J: \- Q: T" w - int[] heap = new int[nums.length + 5];: G) N9 I9 }( i: ?; {4 l) w* ?6 g
- int top = 0;+ B \# @0 _% x. y5 A! S3 N
- int res = 0;# o# r1 u! W \
- for (int i = 0; i < nums.length; i++) {: s! M8 \# y; u" Q9 s$ o
- while (top > 0 && nums[heap[top]] > nums[i]) {
3 g( q: k4 @% N( M8 H. ~6 S3 `( z - int right = i;. j! f# t ^4 O& K, J
- int left = top > 1 ? heap[top - 1] : -1;* N, H$ D/ c9 R& g/ C
- if (left < k && right > k) {4 \& d: Z. O( y0 o, P. {
- res = Math.max(res, (right - left - 1) * nums[heap[top]]);
7 H8 L% _. r! |3 P - }
) r7 X6 j3 K( H, C+ g& | - top--; {' G# Y% B* z% l
- }
' D5 O. ~9 I6 W9 l9 ]. W - heap[++top] = i;6 h( O" p% i$ s0 t) S7 D
- }2 z# s5 v, N, p) [0 r8 C
- while (top > 0) {
% E( N9 x, s, w7 F" e A - int right = nums.length;1 f5 E+ B, O$ |# r
- int left = top > 1 ? heap[top - 1] : -1;: i n, |, c* _4 Y$ R1 S
- if (left < k && right > k) {
E8 e! F5 v* s2 H - res = Math.max(res, (right - left - 1) * nums[heap[top]]);
! q1 k* H; J& M$ X/ ~. F* k+ X - }. F% c8 `* g. b. P9 r9 N
- top--;2 e2 {! s" B7 B7 H5 W$ S
- }
9 G0 B* \+ V9 o; N! o - return res;* K8 u* Q4 ^( f3 ]0 i8 q5 i
- }
# h% x' I& {; O% T; e! x* G - }
复制代码 联系上岸小助手年糕,参与免费带刷
' J* h# Q" k1 v$ @( B6 f |