登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查是否每一行每一列都包含全部整数】
6 U+ F6 g4 K/ q' s' s$ H( o: s9 I
" o% n9 m" y) |& |! U解题思路 {" B: P/ ]* j0 x% X$ G
签到题,可以用排序做,也可以用 Set 做。
, e5 i: U7 d' o) h, T2 _/ S) h1 L1 c
8 C5 C( r& _9 T `代码展示
3 m7 L0 U0 P b/ `( I% y; M" M' j0 K; i8 U+ y d
class Solution {, i" A5 n m/ O, r' v9 S
public boolean checkValid(int[][] matrix) {9 @' ?$ \- |) H: X0 o" n
for (int[] mat : matrix) {
- B! f L0 U! ], ~3 P int[] m = Arrays.copyOf(mat, mat.length);
) q q% r2 h# _2 b: D O Arrays.sort(m);
4 x; }2 t R9 u3 e2 ?! x. e for (int i = 0; i < m.length; i++) {
5 f% O3 l. p% {* r* z+ B' |5 m9 @ if (m[i] != i + 1) {' s8 ~( e0 R3 v% }" b
return false;5 q) C& V& U1 j$ ^
}
3 {0 {0 e9 f3 w+ c& ? }
1 B @& c. R ]1 t" a) B) W }3 T6 o; B9 W& i
for (int i = 0; i < matrix.length; i++) {
9 C3 n5 m4 a2 T c- l int[] m = new int[matrix.length];- e6 T+ W2 A2 g- ]7 u0 T
for (int j = 0; j < matrix.length; j++) {
' U0 V/ M8 T% {% |$ l3 i m[j] = matrix[j][i];
8 ?0 N9 N0 G* i T: r5 F }" z- C2 j9 J4 X; y H6 n
Arrays.sort(m);
7 ~- @. C; m% V- J9 l& W1 o7 o* \$ q for (int j = 0; j < m.length; j++) {( O8 Q% u7 X; \, D' Q g/ |( k k* d/ j
if (m[j] != j + 1) {
: k# l5 u4 G: b return false;
7 E% R( u& c& y- K }
$ R8 s5 I9 J& I& K- m) W% G. U }; e' N' I' H* [8 G: ^6 ]3 T
}5 ^+ y' e/ o+ }- X, P+ O
return true;$ y# F5 _/ i8 z) p3 V( q6 k/ S8 G
}0 X( }1 U/ T' F3 J1 g( @
}
/ K6 q. J8 J" S& z3 @4 D: ^; U8 r' e* s8 r
' L! }3 D* Q" S3 L8 y【 NO.2 最少交换次数来组合所有的 1 II】
! W* x5 p2 d6 D; }4 S$ u& c+ G% j: Z# {/ e
解题思路- N7 ^+ V: g; ]9 @
首先化环为链(将 nums 复制一次拼接到尾部)。7 \5 P, o& l `0 `8 l. h7 ]& A" c, l
0 i' S3 [" O: u- ]' x然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。8 i0 ~3 z, W: z
# v/ A5 y0 u! c7 [2 M
每一段下标中 0 的数量可以用前缀和求出来。
, X% C& l0 j0 J i( f- L1 t7 x. h5 j8 g6 M
代码展示2 @9 q; y* R: j7 h: F; s, \
- a" r/ ?3 Z; gclass Solution {
, s" |6 j0 ]& q& }" Y$ F public int minSwaps(int[] nums) {
- n/ ]! U: f4 f/ [+ D2 d9 H int[] link = new int[nums.length * 2];
7 P7 Y3 Z1 V0 L+ Y. y6 W5 Q7 E for (int i = 0; i < nums.length; i++) {6 A' @# t$ B3 v5 r
link[i] = link[i + nums.length] = nums[i];# j9 @0 A+ t% q! C5 `: ~+ q
}
% [8 A" j# n) X& g/ p+ b6 u int[] preSum = new int[link.length];
3 a$ {: o0 ]- N preSum[0] = link[0];
2 ?+ T! S% m: G, l$ l* W for (int i = 1; i < link.length; i++) {2 _8 l* I& y# O+ y9 t* A- d* L
preSum[i] = preSum[i - 1] + link[i];
: h2 i0 u% n& H6 G }
* O$ G! G; Q& c3 x+ x1 t int tot = preSum[preSum.length - 1] / 2;
3 v" n& G; r+ y2 D if (tot == nums.length) {/ N, |8 L7 v9 N; _" u
return 0;
4 H# }+ p+ d5 k- K# ? J* m. M }0 ?, K/ O3 c' Z- x! X
int max = 0;% e* C2 v2 A. C: }, _5 W V2 f+ z
for (int i = tot + 1; i < preSum.length; i++) {$ { ^ b* e, D+ s4 r
max = Math.max(max, preSum[i] - preSum[i - tot]);, ~& V* k) G* u; s7 C9 C
}, T( t. I5 J9 g' P4 B% R e
return tot - max;7 {7 W+ r. @# B4 F8 b5 k0 j
}$ g- x' m8 a& b$ L
}, \ e+ U9 l5 ?* V A
$ c6 h8 e9 L! i5 t& I1 `' O; q
: Z) F+ h% _, x: o$ k' k! l【 NO.3 统计追加字母可以获得的单词数】6 h9 u0 {, v! ^) K8 A3 N. G
* Q# d7 s2 F C8 @+ ^; W% m9 v解题思路
; o2 u$ b S B- d: G( K( R注意审题,只能追加一个字母。/ h7 c4 k% Q1 g3 M2 G$ @6 b* H) S8 O
7 d3 Y0 R! }" w0 m7 a/ C
因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。
H# [( J& a$ K- w0 s, @: @/ \8 h, i1 d' Y3 O
代码展示- V. g5 {+ u# c' q! \* K- T& u3 N2 ^- p
* q* q1 b5 f* k; O% J
class Solution {
4 |3 a; W3 a: u' d8 e) l public int wordCount(String[] startWords, String[] targetWords) {1 Q% W+ }+ d) l$ ]) O0 V" I0 _; L
Set<Integer> startSet = new HashSet<>();
; [7 S7 n* ?) M. m for (var s : startWords) {# T& p [* I4 F1 v5 Y6 e
startSet.add(toBinary(s));
& ?" \+ {( o! N! j, X* V% M }! l3 f8 q4 b6 b9 k. H; j5 |
int result = 0;
8 }' C; x4 d- ~$ ?! h for (var t : targetWords) {4 k* j1 j; e2 Y3 P. K1 H% w
int target = toBinary(t);
6 R, p. ~4 z% G9 t+ L4 v; q( } // 枚举追加的是哪个字母
6 w! c$ i, |9 h: | for (char c : t.toCharArray()) {, g& Y& X' P4 J& Y; j+ j
if (startSet.contains(target - (1 << (c - 'a')))) {
9 e" i3 |8 }, n result++;
6 h9 I+ w1 w. x `7 l; T break;
& W- x9 ?; p' }- S' q }
9 T2 Q. P' V3 e! h6 L$ t }
7 C2 ]8 [+ u9 D6 h }
) _' C4 a F" o( E7 x return result;2 ~% ~! n3 u, f, c; Y
}& l6 k2 c( H* ~! s5 O
4 j) J8 `" s( l/ J6 z
private int toBinary(String s) {% L) W. u! j* y2 Y( H: b( q! u
int res = 0;
0 F% |: [1 S# ]' J0 m for (char c : s.toCharArray()) {
3 j7 R# k1 S M; i+ ^ res += 1 << (c - 'a');
" @3 n1 Z$ V# ~; K' X }
' R6 F1 g1 q) J% E& _) f* I return res;
2 i* }3 t8 q& ^6 P }+ I2 C) p+ z, W" p- g
}) j" Q0 B' i: {, d* _
) u9 t2 D7 F9 k. \; C$ E. Y
+ ?! Z* ^' f }6 S% n
【 NO.4 全部开花的最早一天】
" D) U( U6 R/ e' R l% ]2 l
6 X5 ?! `9 u3 v& m1 K解题思路
2 ^% l/ ~" X/ C9 R贪心,先种开花时间长的即可。9 D! O! G4 E- \: ~+ b2 J$ T5 d
+ L9 t/ ]: [! Z* {" s" L+ C, J; R# r代码展示3 T1 l6 O7 Z7 O4 N
" l( k% W+ r$ q% hclass Solution {
' E. Q; ~0 b, a+ d' p# |" A$ m static class Flower implements Comparable<Flower> {3 o6 k+ J3 ^$ T
public Flower(int plant, int grow) {5 Z* `: t0 Z; B! C# e% a7 b
this.plant = plant;
, _+ e- O9 u4 G. g2 S' W this.grow = grow;
4 V, y! u, U8 c/ l4 F! o this.tot = grow + plant;/ m1 a, n1 V" Q' ?# |
}: u4 p2 G( c i# V6 {8 X
5 F( m7 ~# W3 ]
int plant;4 v( O/ R1 t. \. K
int grow;
# k' P6 M/ d- ]# O int tot;: G4 v! ]* c/ \ ?* o
4 M; E) Z4 ^$ S% `6 @4 G @Override
# Q2 C; g' A( w3 n4 _ public int compareTo(Flower o) {9 U) ~' f0 G; C, [: f$ |4 N' g' ~
return o.grow - grow;! l: A% _5 f0 s! C* Z
}
' @7 J0 P/ ^+ f% @0 O }
! N+ ?( _& g) V
0 M+ S) y b' W+ I# |& k public int earliestFullBloom(int[] plantTime, int[] growTime) {
8 l4 I; M4 r( B9 g4 P! m6 y0 e Flower[] flowers = new Flower[plantTime.length];4 e+ @4 D5 S0 @, X5 K
for (int i = 0; i < plantTime.length; i++) {
0 I" S8 V3 K- |) }. L+ D3 h flowers[i] = new Flower(plantTime[i], growTime[i]);
% Q4 r$ N8 G9 L6 e }. q Y6 G* f1 G
Arrays.sort(flowers);: k. u) y- N% q
int result = 0;
% L: m7 ^8 i- i9 }) z7 z6 F int current = 0;: u7 X- c% P2 o; K/ {
for (var f : flowers) {. O- S p9 d, C4 U# j/ C4 r8 _
result = Math.max(result, f.tot + current);
3 H! j9 ^ B1 H+ M8 ~2 Q3 j current += f.plant;2 r& ^9 e" Q' `
}$ {; k: J6 k4 `- H
return result;6 K: N, g7 ]5 E l
}7 X3 b6 T. R" |" t0 L, w
}
* h' T s- _9 Z& x9 S |