|
No.1判断矩阵经轮转后是否一致 解题思路 模拟矩阵的旋转即可。 代码展示 - class Solution {
b. c g2 |' @$ E$ o4 Z0 P+ G. Z - public boolean findRotation(int[][] mat, int[][] target) {
3 {/ j- p# o% i - for (int i = 0; i < 4; i++) {
/ F9 u& [' d0 S# j! P$ g" c# T - if (equal(mat, target)) {1 @ e% X5 ]: S) C7 E" O' N
- return true;7 P" S' r/ I4 T" e( c# s; X4 ?! f
- }
( |) r5 I4 z" J8 E3 l - mat = rotate(mat);
; W% V0 w% i( Q, T* p- R r - }9 o4 N1 E1 y. M. o0 k' z V" H
- return false;
9 e9 D# f) ~4 U0 h/ _* T0 l - }
. n: V$ Z% l% K6 R% c+ b5 y - 7 n$ O5 u/ m3 i! |
- private int[][] rotate(int[][] mat) {* F8 T' v# s( F- G4 V" b
- int[][] r = new int[mat.length][mat[0].length];
4 K! _2 _* [2 R0 d - for (int i = 0, y = 0; i < mat.length; i++, y++) {% }: X; I6 J: |6 l0 ^1 P1 X: a2 l3 I: i
- for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {% \! ?; e4 t4 _* X$ f+ {
- r[i][j] = mat[x][y];- b' O1 h1 z2 E$ k, g
- }5 h3 k7 z0 Y$ c
- }
8 Q$ s3 c" a% g. Q# o# D* N* o - return r;
" p6 [0 b8 A4 Y1 s, W - }
9 b* w: Q% N4 O! S
, v- U2 p) c! a5 X3 d; F0 y- boolean equal(int[][] mat, int[][] target) {
a) k$ A4 I3 e2 u+ z# U# H - for (int i = 0; i < mat.length; i++) {
% {- Z) p( p0 V8 T% z3 w9 r7 V - for (int j = 0; j < mat[0].length; j++) {8 e9 g* a- \! g# l/ t* f# e
- if (mat[i][j] != target[i][j]) {
+ {. z2 S& A& j$ C; u0 n: V% i - return false;
) R8 W8 n% i. B - }
+ o9 W: N o* A! \ - }% g8 u) V$ e9 G, Z3 u% H' s
- }4 q( o% d3 O9 e' c
- return true;
* N( |, P4 {8 _ - }
& a- n% g4 Y% m - }
复制代码上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。 长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。 联系上岸小年糕,领取课件及视频 No.2 使数组元素相等的减少操作次数 解题思路 简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。 代码展示 - class Solution {
1 Y0 E4 [3 y* V9 H1 |9 n" g4 ? - public int reductionOperations(int[] nums) {
: n; Z+ z. [* y - TreeMap<Integer, Integer> count = new TreeMap<>();
8 T+ {/ v4 {0 R; U) L - for (var num : nums) {
/ E% h; ?* f$ Z3 F - count.put(num, count.getOrDefault(num, 0) + 1);
x- `" N: i4 r - }" v3 M5 [% ?2 ]
- int result = 0;
. ]4 [ P) T2 M8 O' O, @' \ - while (count.size() > 1) {
6 ]5 r# a6 d% n M2 I* V3 d - var largest = count.pollLastEntry(); r0 h3 ~/ v" ?+ r$ b' _
- var nextLargest = count.lastEntry();
) V5 o Z- w, F& H - result += largest.getValue();
0 @9 t; [) H$ g |2 R" G& B7 q" T - count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());
$ `; E6 V& d* Q - }- y( _3 x1 d. t9 Q" \ A; K# f
- return result;
/ r( F* [0 G! |- C% R' H - }. v" N) Q; O7 d& G4 C
- }
复制代码No.3 使二进制字符串字符交替的最少反转次数 解题思路 枚举类型 1 操作执行的次数即可。 执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。 我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。 每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。 代码展示 - class Solution {
0 ?4 F8 @8 r* w - public int minFlips(String s) {
. Z5 I1 ?6 ~* y u' ~( z - char[] str = s.toCharArray();
+ V1 t1 k) @6 i. I: Y6 u, k - // count[0] 表示偶数下标上 0 和 1 的数量
- A9 M; C* M6 Z8 T6 f. u% L - // count[1] 表示奇数下标上 0 和 1 的数量+ \7 f0 U, I5 B }
- int[][] count = new int[2][2];
7 W3 T$ g: D/ ]& U - for (int i = 0; i < str.length; i++) {
3 T9 \1 z2 _% o; T: J - count[i % 2][str[i] - '0']++;
& f( F3 a; O6 E* \/ f, t - }
( W$ w8 c9 N+ a8 n - int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);
* A+ O3 t' C- F4 S* J7 s2 Q6 H; n - for (int i = 0; i < str.length - 1; i++) {# [% Z: J5 M! @3 j- [3 T3 j# ]
- count[0][str[i] - '0']--;
. Z2 f2 `; ~8 M; T' Y - int tmp = count[1][0];
, f8 f8 _9 v; `5 \ - count[1][0] = count[0][0]; r* S w& V2 `$ w& w
- count[0][0] = tmp;6 I6 L" W+ _3 p- K( B5 E7 a) y; o
- tmp = count[1][1];
4 X R' O# Q" J - count[1][1] = count[0][1];/ z( q7 y! t+ I
- count[0][1] = tmp;
( F. C3 ^+ k" ~ - count[(str.length - 1) % 2][str[i] - '0']++;
6 S, c, d, m" r7 l - result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));
$ x" e( a. G7 j% f8 r1 r - }8 V6 }4 x* K: e$ j- C
- return result;& b, T% p5 b* ~2 i/ p3 ^
- }
5 v* t* o( c" _# i1 b. S - }
复制代码No.4 装包裹的最小浪费空间 解题思路 二分查找。 对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。 计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。 代码展示 - class Solution {
M; M5 l0 u! u$ F$ T9 G - public int minWastedSpace(int[] packages, int[][] boxes) {' }8 R g. t9 V- Y3 Q3 p1 p
- Arrays.sort(packages);* |( Z* T, B9 ]1 S* E
- long[] preSum = new long[packages.length];
* [+ ^1 `5 x+ }% m0 W - preSum[0] = packages[0];
6 |. f' H3 z |8 d - for (int i = 1; i < preSum.length; i++) {; s" Z4 d8 |9 V. z& H
- preSum[i] = preSum[i - 1] + packages[i]; K1 ^# a( z6 Z4 L5 E
- }- e8 D; J' S5 w. a B/ ~6 n. `% x/ S
- long result = -1;+ q K% k8 z* ^6 m& v t3 m
- for (int[] box : boxes) {
6 _. S" ~7 M4 [- @9 u1 i u - Arrays.sort(box);
) J, b7 _$ u0 C - long t = waste(packages, preSum, box);
) R; q) M& i8 p% F# _ - if (t != -1 && (result == -1 || t < result)) {, `/ M- I M, m6 Y- k( y% d! o
- result = t;3 J, _0 i6 @4 ?+ ]( P
- }( k3 V* S8 r% |- X
- }
2 h5 y4 t" H! V# K- o5 O$ [- B - return (int) (result % 1000000007L);
# `, }+ _& ?& b8 P. t" S- S! g - }
! `$ r& M5 t3 ~% M - 0 A5 V6 q4 V* t
- private long waste(int[] packages, long[] preSum, int[] boxes) {3 }4 e9 A) C7 e" }3 p4 f1 Q
- int start = 0;
y! n: z/ o$ ]( p/ L# A - long result = 0;
% i6 A4 N: t' H% {& @ - for (int box : boxes) {' g$ p! ^5 m O" P
- if (box < packages[start]) {
1 M$ p; y% E+ a( z7 W8 | - continue;* L! z) b$ B0 `) i* i
- }! ]5 A' P8 D: j% W6 k/ Z
- int index = binarySearch(packages, box);/ X# X; Q Y- \( K8 N3 K1 Z) F
- // [start, index] 之间的包裹使用 box 装. y4 f. q2 Z- X$ g
- result += (long) box * (index - start + 1) - preSum[index]; v( Q' d4 s- I( [, I
- if (start != 0) {
! S4 B# W* ~2 T6 X" R - result += preSum[start - 1];. W4 u: M2 o+ e
- }9 [) D0 `2 [ J8 k: g
- start = index + 1;% [* a$ s" J# b2 P# u$ `
- if (start >= packages.length) {( k+ l5 n* S: ~. d* e. E
- return result;1 f- U1 W2 M: X' v/ ~- u
- }1 d8 }" w' K0 i# `% s
- }
( d3 W. } q9 `9 M, Q' E - return -1;# s7 R+ ^6 f+ {9 C) ^' R# x
- }& _1 n$ }/ `# W$ x- y
- t: ]1 s7 o% ~8 f, u- private int binarySearch(int[] arr, int target) {, U- _2 U! T- y1 e0 N
- int l = 0, r = arr.length - 1;5 [( ?. Y6 T2 B* P2 @
- while (l + 1 < r) {) s, @' v8 A& c6 f5 a* e- J* |
- int mid = (l + r) / 2;
2 s" H6 I! U2 J - if (arr[mid] <= target) {$ x2 r$ p% s/ N+ B, `- `
- l = mid;0 R. H6 q' I6 b( Y$ M o5 D
- } else {
6 p0 k9 L$ F' f3 a5 ] - r = mid;! B ]( H: X; T' Z$ f
- }
; X" T; w6 m/ D4 m/ X4 l - }
( }/ C8 t h0 e7 ]& ]7 e' B* z - return arr[r] <= target ? r : l;
! l+ B8 Q* j+ w; n( c - }
& i2 U. U& E9 g& n; ~# h - }
复制代码 ' E) u# z- P# v' @' D" m
1 Z) C7 @+ U7 ]. l* b( X0 T7 d+ Q) G
|