登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查是否每一行每一列都包含全部整数】0 Z/ A0 L3 q! W/ m
6 z! K) N( g+ P$ o9 \
解题思路5 p, p6 D: c; }* c% a% n
签到题,可以用排序做,也可以用 Set 做。7 s) _% W% a% ]% o9 s
, F: i* R2 {. G/ Y5 Y代码展示6 k+ \4 f& u' ~" p; g9 P/ d
. S4 p% l0 l/ S" Z4 Z# t* P
class Solution {
( J" i. Q2 t# ^: M } public boolean checkValid(int[][] matrix) {
3 d# K6 K% s; E0 O) s3 R$ k; @ for (int[] mat : matrix) {% j9 L* B# w: |7 ]& E/ C& ?, v
int[] m = Arrays.copyOf(mat, mat.length);
! D f) m. v7 m$ u Arrays.sort(m);
' z% V7 ?- v9 s for (int i = 0; i < m.length; i++) {5 x& z+ {1 F& j ]6 \
if (m[i] != i + 1) {
( ~: O- _% P- R) k; t return false;- e ?, `0 |& \3 i1 `! s5 Z, R
}
. M+ N3 u6 k3 F1 c( f2 m }6 ?5 }- W/ G, {9 G# T+ R
}# X/ y( V( x2 l& c6 U( ~5 f
for (int i = 0; i < matrix.length; i++) {
+ C' W& h3 [$ w/ X4 @$ R int[] m = new int[matrix.length];
) ~3 k# T% L9 B1 `# m for (int j = 0; j < matrix.length; j++) {
/ x! w2 |6 k8 w% F, f m[j] = matrix[j][i];, X+ V J& \* ~' B
}
' {2 a! E5 G/ L0 ]$ h Arrays.sort(m);
: }7 ^6 `- T/ t; K for (int j = 0; j < m.length; j++) {& \0 K( r9 S, m5 X% [$ ]( r) _9 w
if (m[j] != j + 1) {7 E0 I! T/ t" c* _" B. L5 I6 ?. P
return false;
% f8 r! U/ M* e2 p }$ L5 @% N: v* x1 x6 s
}: r0 V& u9 ?' o4 p8 v
}5 \9 | h- g* x2 @; \4 z% S, K
return true;% ^% N c+ X9 ?/ j) m3 Q/ z) q! R
}* s/ Z4 k9 H% f
}
/ ]# y' ?( B+ q# h" L" i2 l! m- B5 G% _
$ a( F6 ^# x2 B" j2 ]4 {$ V1 k
【 NO.2 最少交换次数来组合所有的 1 II】) ~" C2 c/ K' `' \! @9 o$ b# o+ U
& V5 ~+ C% X. l& [" N" B解题思路
+ b! ^0 @) X G1 j& [4 C首先化环为链(将 nums 复制一次拼接到尾部)。$ P+ Z; {5 [- i8 }# n9 l
. ?" w' B1 Q; V6 E
然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。! b* ~# m( H; e Z2 m8 z, y
b @7 ~. ?2 ?5 ~0 s! `- @/ k0 x5 s X每一段下标中 0 的数量可以用前缀和求出来。- r5 d; v0 F# [; y+ @0 g
. d$ H9 F) V" U$ O代码展示6 ?! z' S: T/ t
6 c' x u+ Z+ Y0 b/ g' E! @1 uclass Solution {7 _+ H3 e3 T& Y5 ^& K! L) a
public int minSwaps(int[] nums) {
! |8 f9 A4 r2 ]/ ]' e# z: _5 v int[] link = new int[nums.length * 2];; V% v* f+ ]9 p- \! {& N2 |
for (int i = 0; i < nums.length; i++) {0 s- x" n/ E3 ]1 T9 Q6 `
link[i] = link[i + nums.length] = nums[i];
7 Q; d! Z, s2 A) k7 Q }
# P) i' \' E4 X3 Q+ A, R int[] preSum = new int[link.length];! [( R$ D. q9 b" |9 G1 K
preSum[0] = link[0];
+ q/ [) y- l h q for (int i = 1; i < link.length; i++) {
% U; M# Z% z# o5 m4 T" H preSum[i] = preSum[i - 1] + link[i];
5 A2 r$ l- q- X" { }
, ]5 o8 a$ c5 n int tot = preSum[preSum.length - 1] / 2;7 i9 Q- N7 F% E" b4 l' d) B( p8 H
if (tot == nums.length) {
# @2 v# F4 z4 s6 W* @+ h return 0;5 x% U4 O2 n" y2 w
}/ b. v/ j) @+ l7 H: H+ p3 _
int max = 0;8 p: U; P1 n8 K& y2 Z. M- w% s- `
for (int i = tot + 1; i < preSum.length; i++) {
0 S0 R8 }3 ^% g max = Math.max(max, preSum[i] - preSum[i - tot]);
% j7 a ?' X# ^/ d. p }
! v( |' P0 h0 {9 u" Q return tot - max;
0 \! A: c2 z6 Q% f" S# I! J }9 X$ D6 R* J7 C' i+ k# [3 M f# ]& O% \
}
1 L( E; U9 Q! x0 H
: [+ m% G5 s k$ k" r' X
" c q! A; R2 R R _【 NO.3 统计追加字母可以获得的单词数】5 o/ M- h, f# y9 \6 S% A; ?
1 {, W+ C! W* ?+ g1 f解题思路: T8 @, P/ C4 J- z, G" b4 b
注意审题,只能追加一个字母。
. A( ^5 R) x% Z$ i8 R7 m1 P5 w
; N7 O S. @' @$ B; l3 ` U因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。
% x. w0 A' y) S- L; S; i+ [8 y8 a2 J8 |
代码展示9 f ?$ v. U2 M k5 O
; _# Y$ Z, m" M T; g& Aclass Solution {! b: j3 g( h* u G
public int wordCount(String[] startWords, String[] targetWords) {' u d8 w, J% C/ o; s1 Y7 A
Set<Integer> startSet = new HashSet<>();: U' o! o$ S0 J
for (var s : startWords) {, n" V9 y: ~! J/ b1 i B. |, A
startSet.add(toBinary(s));
: z$ O+ O. @: L9 |9 F. c+ ]1 ? }5 a- n p" Q8 H
int result = 0;8 f! h0 f( p, `5 X% |
for (var t : targetWords) {! }' v* k# D! _3 v2 n
int target = toBinary(t);8 e0 t9 q0 v9 l- H
// 枚举追加的是哪个字母; k6 K) e& k6 Y& }
for (char c : t.toCharArray()) {
^7 T! G% t2 B4 i if (startSet.contains(target - (1 << (c - 'a')))) {- I" v" J/ F, |( ]0 o A* T, S. }' p
result++;) h* z0 N, D, w3 R) l5 @5 Y2 r
break;! _/ F. i* V% e7 X0 t5 w! O
}0 k1 r2 V: Z# w' E
}5 T0 \: V4 ^$ S8 j0 r3 [
}
( u7 X d1 F C U& y return result;- b% O$ L; p2 [/ M# Z# H% w! F
}
4 S# U2 ~2 Y- z& n" i: H- v; b, y$ f1 {
private int toBinary(String s) {
# P3 [, @: G* u8 v, S$ b! | int res = 0;
5 J2 C7 x* e5 o& [3 V for (char c : s.toCharArray()) {
9 S, l" z1 K" S- z& p7 I1 x6 M$ l res += 1 << (c - 'a');
; y9 B4 q1 F9 u1 T* E7 G5 [( F }
* o% V3 G( W0 b/ u; {* ~5 W return res;
' m7 y% q5 Q( Y. p) m }& X: n0 y9 H! ?
}& V" n7 p3 b6 V1 g* f7 B. f
3 s$ s4 B3 ^2 m. `8 m
4 `4 I% f1 r7 M7 x" G6 Y- H【 NO.4 全部开花的最早一天】
+ f. ?# _/ I3 `* }9 X6 Y+ F% }7 `( t
解题思路
5 A d8 A* b" p) M. z, ?" I贪心,先种开花时间长的即可。- H/ D% S- T W/ j. q; M, c
9 V! {& S a6 b5 ?代码展示
$ A' i; g$ _* s! y# c5 k, {. p$ ?- W9 e# g
class Solution {8 O$ W7 ?& z- q" H+ i
static class Flower implements Comparable<Flower> {, c, a8 W5 n1 f
public Flower(int plant, int grow) {
+ o0 k: b2 \) v+ S; h this.plant = plant;- N0 z, a$ C0 W/ O
this.grow = grow;
; x" D$ k5 ?" U) \6 C' O. ^ this.tot = grow + plant;
" p8 K E. v/ P u0 o3 `% b }( |% }6 g, [6 U. R0 {! P8 B2 s K) M
% H- F; O2 A" Z% V
int plant;
5 H; |; W/ v/ c$ k- a$ O) G int grow;: B' I- g3 W6 G) g; a1 m
int tot;: _* H2 Z5 K. L1 y* c% @- @
* S+ V& p# P" D( ^0 M. k7 [/ | @Override; \8 S$ Y1 T' J9 l7 l; m
public int compareTo(Flower o) {9 {7 {/ s( L; j9 Z; g
return o.grow - grow;: B% J8 b \. l- j @% f- Z, v! S# c( O! Z
}
5 Q7 J; n& }6 v$ a3 ~( ?- D' j }
9 t( E3 C* n0 |2 |! p, ^" v% m9 G/ J9 F& _2 y
public int earliestFullBloom(int[] plantTime, int[] growTime) {& J1 b# M& L2 v- ^! z2 t$ i& r; E
Flower[] flowers = new Flower[plantTime.length];; K+ ]" d% i: o* \8 g+ s# X. C
for (int i = 0; i < plantTime.length; i++) {1 w* [/ i) o4 T b1 U! ]7 p2 D ]
flowers[i] = new Flower(plantTime[i], growTime[i]);, R, i( ?3 B- T8 a
}
. x* l( X- {/ V, w* P6 B+ j Arrays.sort(flowers);
8 R/ q: y8 D+ X$ o. D int result = 0;
0 M$ F) H, K+ U% z$ @ int current = 0;+ \& S" r9 y ?. g& v; R# R
for (var f : flowers) {6 a7 t0 B) \" a" |- L! ^. L& n
result = Math.max(result, f.tot + current);
3 n& a5 F+ F6 w* u0 v$ O' h current += f.plant;5 U$ _8 x) a: F# C9 Y2 E2 Y3 M
}
: k0 L1 u3 g6 z8 G return result;3 J8 ^2 I) H2 Q/ f# y; z4 }
}
/ c9 P9 @6 n( m# R1 }! U- N}
# F0 @% R& P- O+ K) a6 I { |