No.1判断矩阵经轮转后是否一致 解题思路 模拟矩阵的旋转即可。 代码展示 - class Solution {
( _4 n0 @* M3 ]0 f0 K* B$ e - public boolean findRotation(int[][] mat, int[][] target) {& O! s {+ r! B+ m% d4 z S
- for (int i = 0; i < 4; i++) {8 ^! V& S# ]8 |
- if (equal(mat, target)) {
A. y* i8 c2 F$ N& s - return true;9 c! |5 o4 l( C: ?4 N }5 d& Q$ a
- }+ Q/ C9 X [: M/ ]+ e! o( I
- mat = rotate(mat);
7 x; t! \" t4 Q - }
: S/ U0 L$ B0 l% p6 @, A - return false;7 |; k" y( [; N3 E! e. ?; L
- }
7 z/ M6 {2 g3 _
$ }7 } H) D# Z, u. c- private int[][] rotate(int[][] mat) {
; M4 V' g0 g) ?3 p - int[][] r = new int[mat.length][mat[0].length];. Q) \" z) f( H
- for (int i = 0, y = 0; i < mat.length; i++, y++) {2 P! R3 T6 E7 B1 J$ X/ ]6 ?3 }
- for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {# Y ~9 }5 z6 O& f' p
- r[i][j] = mat[x][y];
5 }' D7 U D* Z6 J - } ]6 M1 U3 G+ j/ o( V7 W3 R* Y
- }8 I+ p0 D! u, n$ r
- return r;
/ `, g+ H$ n: V: e3 \ - } j/ Z, \# z$ k/ W+ c' [1 H
3 z% J4 H) r8 [- boolean equal(int[][] mat, int[][] target) {
- k( t0 F6 o' | g5 ~7 N* g - for (int i = 0; i < mat.length; i++) {
6 z) S3 |9 m& z7 J; b: F) o2 m - for (int j = 0; j < mat[0].length; j++) {+ A/ T& r. P. g' D6 D
- if (mat[i][j] != target[i][j]) {7 U! y- Z6 P$ ~+ i- l: A# w6 c
- return false;
" ~6 h) G6 Z1 n9 Y. f" r - }
: q# \ y8 }/ c$ h9 E - }
3 ~) E1 e: U3 h0 T% R5 _+ ?, E - }9 N2 p: M1 ~1 N
- return true;
) j* P& `6 M8 r# e7 z - }& ]4 G1 P0 a1 i
- }
复制代码上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。 长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。 联系上岸小年糕,领取课件及视频 No.2 使数组元素相等的减少操作次数 解题思路 简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。 代码展示 - class Solution { @6 ]0 S, P. V0 k" L) d0 `5 Q
- public int reductionOperations(int[] nums) {0 V* C! @! E, q' L2 ]8 R
- TreeMap<Integer, Integer> count = new TreeMap<>();
2 t$ z1 ~& ^2 \ - for (var num : nums) {
$ g6 {6 a& X4 J* c; a+ H - count.put(num, count.getOrDefault(num, 0) + 1);1 G4 L; k' e* m2 w
- }
! i; q) c3 Q0 z& L5 U2 P - int result = 0;
; ^% x" O O" J - while (count.size() > 1) {
0 T. x3 n* ]8 Q6 `6 v# |7 _ - var largest = count.pollLastEntry();! N5 k' H# k+ S- F
- var nextLargest = count.lastEntry();
7 r6 T; e3 O. ^# X; j - result += largest.getValue();
" z( p) L3 u0 v7 K - count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());0 i0 V5 i* _, h3 q9 C& O* w
- }
/ m' |: o1 \5 o3 _9 n" t - return result;
4 ]4 D3 x5 }7 O" Y% _: ?9 O - }, x5 N% C" ~; w R6 I8 I
- }
复制代码No.3 使二进制字符串字符交替的最少反转次数 解题思路 枚举类型 1 操作执行的次数即可。 执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。 我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。 每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。 代码展示 - class Solution {
! c( q$ N0 m. Q \# [ - public int minFlips(String s) {+ j+ j0 e2 ^ m" p, @
- char[] str = s.toCharArray();
% q5 y8 J0 e( m5 a7 P; a O - // count[0] 表示偶数下标上 0 和 1 的数量
: z' c/ C! K( G; z% c - // count[1] 表示奇数下标上 0 和 1 的数量
/ l2 d6 A; c w, D4 g) V7 q6 W1 A# e - int[][] count = new int[2][2];9 K2 Q. F- @ ^! Z" A" ^7 i
- for (int i = 0; i < str.length; i++) {3 t" Y0 ?$ I" S
- count[i % 2][str[i] - '0']++;
" D% z$ M2 `2 P9 M - } s0 w* X( Q! Y! E
- int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);$ o' @! g$ o- s1 q% d- K( U% \
- for (int i = 0; i < str.length - 1; i++) {
5 s, Q3 C1 S4 }% [: w$ P# B# Y - count[0][str[i] - '0']--;
) a7 x9 I/ i# j" U* Q - int tmp = count[1][0];
* G t: _# }' r6 J' ^ - count[1][0] = count[0][0];2 f$ D6 R2 t( d. R% @: F
- count[0][0] = tmp;
% U- k- x$ F& L7 ]/ N* O% K - tmp = count[1][1];! v( H, B+ a# ^( X) y
- count[1][1] = count[0][1];( M" [ M) C1 l) B& Z! f
- count[0][1] = tmp;
: j8 f' J# A0 T0 P* g - count[(str.length - 1) % 2][str[i] - '0']++;
/ ~1 R, |2 e' c2 N `' }+ {# ? - result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));3 B3 H& {$ x8 {7 o6 g
- }9 z8 @$ t+ M6 C4 X3 x- i
- return result;2 m# X* L6 L( X/ S8 ~. r" n% l
- }6 x, m* \/ T! V* Y% m
- }
复制代码No.4 装包裹的最小浪费空间 解题思路 二分查找。 对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。 计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。 代码展示 - class Solution {
2 V0 E" s' b* v8 M" [5 x0 s/ } - public int minWastedSpace(int[] packages, int[][] boxes) {' u, |+ O* O, B8 x. [
- Arrays.sort(packages);
1 z. e8 s! L4 U) Y4 d z3 G - long[] preSum = new long[packages.length];
5 p! ?# V& ?0 V d2 {* p( z - preSum[0] = packages[0];
8 D! C' f* w4 ?' d9 R& R - for (int i = 1; i < preSum.length; i++) {; X. H- c: d( O' c: I0 F5 ]$ {
- preSum[i] = preSum[i - 1] + packages[i];
3 X+ @; f# e% v' c" ~" n - }2 j& p; n# j* N0 f
- long result = -1;
8 V4 u$ u" q9 n4 h' b; f - for (int[] box : boxes) {
7 s% t6 ] |; k' B, l - Arrays.sort(box);
2 U) J1 o1 b, {1 V+ I0 e+ B - long t = waste(packages, preSum, box);
- L% x! k: m Y7 o" X - if (t != -1 && (result == -1 || t < result)) {- g& f: i, U. o2 g7 m
- result = t;7 |7 A( t' m6 J1 K7 j, H; j9 x
- }* t: o. v; a6 _) W1 V& T- Z! Y& c
- }5 k5 s0 D; @" o7 r, Y* W5 f& y0 l
- return (int) (result % 1000000007L);5 l. \ G1 o9 ^# } K- C5 o
- }
: h( t* K" H1 o8 a6 [
1 G7 p- M& C. ]2 @3 T/ J- private long waste(int[] packages, long[] preSum, int[] boxes) {; ?( ` g2 @5 Z$ D$ D
- int start = 0;7 z" z+ @4 h8 o2 U$ P% s+ W5 K
- long result = 0;
$ o* Z& \/ L9 e1 b" U }- ]) G - for (int box : boxes) {/ O. t; P2 k6 b5 E( z0 s) X
- if (box < packages[start]) {
2 _3 S& a8 U$ t" | - continue;
# B8 U5 Y" j) v4 v/ | - }
/ ?( @" Y$ l% }! p2 f - int index = binarySearch(packages, box);9 K; v. i( N- O: a9 U
- // [start, index] 之间的包裹使用 box 装
3 x( B; P& y9 k3 S9 v! ] - result += (long) box * (index - start + 1) - preSum[index];' n0 x' B+ [0 V' m- |8 f
- if (start != 0) {2 }- W- ]8 |+ Y+ Q& P4 b" d
- result += preSum[start - 1];
; Y: f+ x- j5 \0 Z3 d8 X' O - }3 k F3 ^- L" O6 \. ~
- start = index + 1;3 f. @. K) d) z- x4 p) w
- if (start >= packages.length) {
9 f/ H& K1 K! _" Y n0 [; _% W - return result;
9 h1 b8 X' ] N' K. i' @ - }
* S) e$ n2 K _4 R2 b( _- [' N3 v" l - }
: H& Q' L2 n) P0 K$ q/ V! S - return -1;
! \% V3 L' K, n# Y - }
8 S. E' ^0 @2 u - 0 [ S5 J3 k: Q/ U
- private int binarySearch(int[] arr, int target) {$ l8 {, \% F6 j/ D3 J, Y, `" u, \- i2 o
- int l = 0, r = arr.length - 1;
1 X: \, N2 R2 g7 s' Y" B - while (l + 1 < r) {
; {4 [4 J" g3 g5 o: \. u7 Q2 S, K - int mid = (l + r) / 2;
& y8 h/ W; K5 }, Q - if (arr[mid] <= target) {
" y5 w; [, n* c2 {$ @5 g - l = mid;
9 m( ^9 E6 R2 J* M - } else {3 u& w V3 c) }
- r = mid;$ @! j: R1 J( \
- }2 X+ g: |6 D8 s0 V( ]
- }
) k6 U- w9 D+ Z! F1 m" g$ Z; ? - return arr[r] <= target ? r : l;
2 A9 j/ |0 x# J$ q - }8 a$ T8 [1 x; E' M! Q" x; F1 v
- }
复制代码
$ M# t: X+ a* u& }& F1 T/ S; ~* {. {# `- G+ V
|