|
No.1判断矩阵经轮转后是否一致 解题思路 模拟矩阵的旋转即可。 代码展示 - class Solution {# v0 r# u5 X1 v/ S% g
- public boolean findRotation(int[][] mat, int[][] target) { i' S# o$ g6 u$ }: W9 S
- for (int i = 0; i < 4; i++) {% T% P6 _' \, a; m+ a+ |
- if (equal(mat, target)) {& l! x: K) Q5 m+ j8 ?" d
- return true;
5 R+ r) Y3 ]7 M3 ^0 Z" q - }
. D" l7 A1 \* \ - mat = rotate(mat);7 P' ]4 _7 Y" B7 ?
- }$ C% ]3 m( e: n
- return false;
, q# b: g- Y& `. b5 P7 F9 ~* Z5 R' r - }
9 [7 L$ U" ^* d# }
: \! @+ O% R+ e5 b3 e2 h- private int[][] rotate(int[][] mat) {2 N8 [. k4 N6 y- B# {
- int[][] r = new int[mat.length][mat[0].length];
1 W0 e. R8 G) i4 E( r - for (int i = 0, y = 0; i < mat.length; i++, y++) {& a* P" A- X! E' e, Q, l# u, p
- for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {8 O$ Y7 h6 q: t0 Q# q1 |# J
- r[i][j] = mat[x][y];
; o3 Q0 C! A' T4 F$ J& j% ^$ D2 w- s - }
& ]) C0 E0 R3 p; [/ ^ - }2 h+ ~8 u. ]" {
- return r;0 a" _ }* n0 G p6 B% W2 `
- }
, O, u# E; C9 ^2 f
. L* W6 Y1 U# U* j( v, m# `- boolean equal(int[][] mat, int[][] target) {
1 d2 Q0 ]' G9 w" n! D - for (int i = 0; i < mat.length; i++) {
) `. b# R' n' N7 w- g' B - for (int j = 0; j < mat[0].length; j++) {$ W8 n# V1 v+ v( U
- if (mat[i][j] != target[i][j]) {# w/ y- z# `4 {' Q# {
- return false;
, P+ q; `' s d; Q/ q - }
( a$ `7 X: n- V7 I! s - }9 A$ r; q5 U3 w/ ^- a& Z0 u
- }) S( g: p( q3 B) B# [; ]
- return true;
. \% x& i3 y7 z* J' _0 B7 B - }8 n' ]4 R# i* J9 K; X
- }
复制代码上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。 长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。 联系上岸小年糕,领取课件及视频 No.2 使数组元素相等的减少操作次数 解题思路 简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。 代码展示 - class Solution {
* b1 P7 ~; D( [: z - public int reductionOperations(int[] nums) {
/ }* k- m- J8 J4 v0 x - TreeMap<Integer, Integer> count = new TreeMap<>();: e9 A! Q0 z$ d8 S
- for (var num : nums) {
* o6 f/ Z) g9 c: u& _) x - count.put(num, count.getOrDefault(num, 0) + 1); J# h( n8 k. y A' G
- }
R; \. X; q4 @ - int result = 0;
: b6 l" U4 ]" r* \& L: D - while (count.size() > 1) {
, B: t8 k6 v9 F, N/ d# k - var largest = count.pollLastEntry();$ ~( o: B1 |2 P D7 J8 |0 R0 w
- var nextLargest = count.lastEntry();! P, x* J5 u" ^8 Z
- result += largest.getValue();
7 j3 c" N* U' H5 F - count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());/ @4 N3 _3 f1 J) R
- }3 R( ~' D) u. {) R" d3 }
- return result;! j7 k! u7 M! f5 p
- }& t0 b: |2 n0 g. J3 B# x! U+ P y
- }
复制代码No.3 使二进制字符串字符交替的最少反转次数 解题思路 枚举类型 1 操作执行的次数即可。 执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。 我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。 每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。 代码展示 - class Solution {
: B9 ^1 C; [: P7 Q8 [( k0 B0 r. P - public int minFlips(String s) {
6 B# @2 |- c% U& h5 f' U* w8 [( z - char[] str = s.toCharArray();* p: F1 b9 o. w+ E* I6 t6 Y9 f9 E
- // count[0] 表示偶数下标上 0 和 1 的数量
* f% _/ g: g. R2 R5 h$ Q+ {3 b% L - // count[1] 表示奇数下标上 0 和 1 的数量# b' _4 Y( w) Z l8 V3 b
- int[][] count = new int[2][2];% @8 s7 J4 q1 D
- for (int i = 0; i < str.length; i++) {
, l8 o0 C8 {; ]; A z; j: { - count[i % 2][str[i] - '0']++;
0 q9 K& Q' [4 U! P$ V( h, q - }7 b* F2 L' k/ H7 O; I. }
- int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);+ w* L, M, \/ g! Z8 \/ J
- for (int i = 0; i < str.length - 1; i++) {! f& G! r ?9 u( A0 i S5 S3 q8 d
- count[0][str[i] - '0']--;
/ s; k9 s1 L1 c' e - int tmp = count[1][0];
. ~# [3 {9 P g9 u5 c5 U - count[1][0] = count[0][0];8 V" q( p; W% f: y! ? [, c' X
- count[0][0] = tmp;) r; c/ a H6 l% B
- tmp = count[1][1];
* _3 B9 v, N# i r+ @, a - count[1][1] = count[0][1];
7 ~3 m9 Q4 ?" u) e# U' v6 S& s - count[0][1] = tmp;2 R! e3 m1 _6 ~
- count[(str.length - 1) % 2][str[i] - '0']++;
+ @' C, j6 t) L% x* n. e - result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));. `$ h" R8 W2 F1 ]! C( e+ A
- }- E8 E0 a9 Z5 [! v
- return result;$ K4 W6 I, J$ Q
- } O$ ^; q! H# j7 j! m
- }
复制代码No.4 装包裹的最小浪费空间 解题思路 二分查找。 对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。 计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。 代码展示 - class Solution {) n6 s Y2 T* ~% s0 W
- public int minWastedSpace(int[] packages, int[][] boxes) {
. i6 W/ t5 E2 N0 ] f- d - Arrays.sort(packages);
; T1 y- O1 }- S3 P% S - long[] preSum = new long[packages.length];5 E# f& }! k( p- T
- preSum[0] = packages[0];
6 f2 Q+ o" l- p, U, r# G3 d - for (int i = 1; i < preSum.length; i++) {
5 j0 x: O( B' z. J - preSum[i] = preSum[i - 1] + packages[i];
: N2 W* m% L2 }( M" O3 u - }
* W0 q" ~/ ?% v" `) P9 ^ - long result = -1;, [/ `5 Y1 f( H: ~
- for (int[] box : boxes) {
( \) ~& q% l0 Z7 O/ E, e' H% w - Arrays.sort(box);" s; C+ Z$ |! W w
- long t = waste(packages, preSum, box);" x! G. ^& ?9 ]6 v
- if (t != -1 && (result == -1 || t < result)) {
3 `8 \' `& N# C4 U6 r8 b - result = t;5 A) A0 v( d. t: N
- }: N, t; q! [5 t* f
- }, d! f# s! y4 `6 a
- return (int) (result % 1000000007L);- j5 ?- p6 W V3 ]
- }
( D# V0 G8 i- U6 k) |! b - 0 G8 P* K# @2 }
- private long waste(int[] packages, long[] preSum, int[] boxes) {3 Z! z7 i! W2 G5 H
- int start = 0;8 z) ? q$ X; g k E" j
- long result = 0;
3 D* f7 o6 C: J9 a" c8 C6 k2 I - for (int box : boxes) {* J) E9 ?# p+ }8 ?: L! s
- if (box < packages[start]) {
( x& Q. q! U. F0 ]. f - continue;
* U5 f- z0 u/ }9 f0 l) F% ?: ` - }
4 o' @# X0 a/ y e# q- X - int index = binarySearch(packages, box);% ^6 }/ U/ s1 L5 [. [1 l
- // [start, index] 之间的包裹使用 box 装* @. j- S1 W. j0 }5 T, w
- result += (long) box * (index - start + 1) - preSum[index];1 ^* f' b! J' z, ?9 A' L
- if (start != 0) {
8 `5 t. Z* m* R - result += preSum[start - 1];- `) O6 q- t$ S5 _
- }
6 V) z' }) L) k' q - start = index + 1;4 U T. E3 v" L7 t* W
- if (start >= packages.length) {* d2 d) J0 C4 h: ]( I- d
- return result;
& c& ^, X( a+ \8 J - }7 j0 g8 D* a7 C4 f& q- d
- }
0 [1 F8 s* @9 w* _, v5 A l, f - return -1;+ H7 c ?+ w5 X P
- }
/ |2 @' v3 A* P7 Q# @& I6 ^1 R
5 t% ]/ L3 s+ `- private int binarySearch(int[] arr, int target) {
$ e% K! H- {+ f, f' Z' k9 T - int l = 0, r = arr.length - 1;2 U2 G. ]& Z& o8 v
- while (l + 1 < r) {8 T4 W; ?" k; v
- int mid = (l + r) / 2;1 @6 J: f$ F# i& P8 O6 U) E( m; w
- if (arr[mid] <= target) {
$ T7 M+ _3 K$ p- Z9 ~ - l = mid;
0 H7 S- ^( L( Q7 f' {0 { - } else {
; d# D4 g2 W6 H$ S+ Z& m; S - r = mid;" i) [* f5 o& F* A4 B
- }
. Y: w3 v9 \+ h- Z _& | - }/ N6 w0 V r7 U# `9 h
- return arr[r] <= target ? r : l;
! Z/ x$ q4 Q4 Q2 Q - }
8 ^- [1 R5 J$ l) G% l% R - }
复制代码 ; g9 H; f" D, f# x1 ~0 L) u
$ n# y2 D1 `+ s4 N |