登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查是否每一行每一列都包含全部整数】2 U" C% d6 e- x$ q! E% \3 V0 s3 N
, q& \: ~7 [- V/ T
解题思路( k8 F& r1 A2 I" _1 |9 v1 L
签到题,可以用排序做,也可以用 Set 做。# j+ H! A" h. [# S F. u+ @! D& l
3 G7 z, z% W" Q3 D5 f2 s+ o代码展示) l) w# Q5 l" ~
2 l0 r9 R4 w A- B) m
class Solution {" f# [9 I' k. |3 K2 c7 B2 u, n
public boolean checkValid(int[][] matrix) {, ~' B9 T# L, q# L) f+ \( G
for (int[] mat : matrix) {
' D0 R9 ~$ U* F. W& P% l int[] m = Arrays.copyOf(mat, mat.length);' l6 d9 R6 ] i) p
Arrays.sort(m);
3 L' @' h8 Y V2 q8 O for (int i = 0; i < m.length; i++) {
4 G' t3 r+ I, O) k! X; W! w3 ^ if (m[i] != i + 1) {
, d! m7 l2 O( N* a+ m$ t return false;
+ i- M8 \" x& `1 f! I+ F# ` }; C4 ?. Q2 V2 {8 \
}. Y- H. m/ j% G, _
}! E l# d; u$ l- S ]0 g
for (int i = 0; i < matrix.length; i++) {5 e! s( C1 m D
int[] m = new int[matrix.length];
' Q7 _1 H& M$ ]% p7 o) \. }" V for (int j = 0; j < matrix.length; j++) {0 X5 }. X s1 u$ ^. a# e3 e
m[j] = matrix[j][i];
! I! J3 {0 q9 q$ F0 Y }- d2 h3 z( S, g) c
Arrays.sort(m);- i3 A; F4 Q2 k. j* ]$ e ~$ C
for (int j = 0; j < m.length; j++) {( O4 m5 h( b( `$ A, H
if (m[j] != j + 1) {$ b4 W2 U4 `/ B1 V5 J6 T6 t3 r
return false;
6 u1 \5 ^* a: \, x0 K: l$ T) e! Q( d8 U }
, A* V; y% M2 z3 K/ L }% T5 u6 K0 B$ x C: z/ b& V0 {
}# a# |& r% }. J" h1 E
return true;: _; C* W* P9 o+ P6 c
}+ S t$ |( u0 M9 b
}
3 L. }3 s. y3 Q# h' M, l- O6 f: B1 {" U
" h1 C" `6 ]7 p4 H
【 NO.2 最少交换次数来组合所有的 1 II】, T% U9 @" {; J" e
! k5 D* k* W' m0 ]( G, @4 l- B. z# L x
解题思路
, T; U3 S0 p6 ]. t& P首先化环为链(将 nums 复制一次拼接到尾部)。
3 d/ C! x* i& J. x# O' y, V" k* `8 B4 N: o7 |$ `9 N# _
然后枚举最终结果的位置 —— 连续 tot 个 1 分布于 [i, i + tot) 下标时,需要转换的次数就是这段下标中 0 的数量。- b( ?- |+ ?' K
3 {) T+ E* a& U0 \0 x c% I每一段下标中 0 的数量可以用前缀和求出来。
* c& ~* {9 G, w) p: l- q/ V2 P' f* c# l& a) j, e4 [
代码展示
/ i1 |/ J. G4 d* O, K
* L0 w h7 u: X1 j& G) Xclass Solution {
4 }' A. u4 M0 U4 B" H public int minSwaps(int[] nums) {
4 p. k1 V9 ^/ q( \2 w int[] link = new int[nums.length * 2];# g( [& \& G# U+ U% g; y
for (int i = 0; i < nums.length; i++) {9 F1 Y# C4 a- r0 m3 g8 ~9 t0 N6 f N
link[i] = link[i + nums.length] = nums[i];
5 N# R# l# h7 ?' {6 F' V G$ { }" z% a! d ?" l) v* H# a9 K
int[] preSum = new int[link.length];
$ ]3 P* i1 l3 }; s a preSum[0] = link[0];
( m+ D6 F' Z/ @% I- l for (int i = 1; i < link.length; i++) {
, D. V' V- ~- Y0 \. ` preSum[i] = preSum[i - 1] + link[i];
! }$ J: y, I. \# D }( @# l& A0 H! l8 ^0 s2 W. w
int tot = preSum[preSum.length - 1] / 2;8 W5 f$ f, O; _) n" u# |9 C8 h
if (tot == nums.length) {/ ]: e# d5 L: w" l$ ~# ~
return 0;: I4 {) d/ T! `% g- G) F' o
}- S) y ?' F3 x& @ a
int max = 0;2 a8 k7 x. m- W9 ~; y5 V
for (int i = tot + 1; i < preSum.length; i++) {& O0 _. A+ h/ J* T; k
max = Math.max(max, preSum[i] - preSum[i - tot]);# R/ C9 K+ ~2 E) c9 {: E5 R- H* K$ I
}
' g+ y$ T' b5 w g- I/ p( s; j! J8 {$ u return tot - max;
# s" e6 z E: P }
3 C1 A/ X5 I1 m7 O( a6 U}
, x M4 O4 C/ a
% j5 H- |9 _/ Q L! \, I) ~( S1 p# R( o" v# ~/ a
【 NO.3 统计追加字母可以获得的单词数】
: a3 S, D$ S$ R( w# G: X* `6 o. Q2 ^; B# D' K, h. g( g
解题思路
0 R( Q8 l% g0 h; M, M8 Q注意审题,只能追加一个字母。
4 ]) J0 ^( O* B& O3 Q! `& V0 a. U1 E+ u0 k Y% T: d
因为题目不要求顺序,所以我们可以使用一个 26 位的二进制数来表示一个单词。 l& l+ j+ e* [# p$ a5 r- {& D
% g7 }2 ]5 A. Z+ J
代码展示
- z" H4 q, r8 o& q
; p0 Y+ g+ \" `. B. Oclass Solution {; A3 e! w# j, W6 U6 k
public int wordCount(String[] startWords, String[] targetWords) {
8 _( D Z! h6 b Set<Integer> startSet = new HashSet<>();
5 A% m$ _: s" g$ r) M" @2 C for (var s : startWords) {7 |( ~* d! D8 D8 F, M5 g
startSet.add(toBinary(s));
, s9 w! @8 V5 B+ Z" y% p. K }
' y- l' {: D- |2 p. e- U2 V int result = 0;
8 G: q+ ^. e- A7 b8 o for (var t : targetWords) {4 [- X6 O& k0 }1 P P: G3 C% @
int target = toBinary(t);
0 c( f5 a7 b$ ~4 Q // 枚举追加的是哪个字母0 \2 Y9 Z5 O0 k9 ^! ]5 x8 ?' q
for (char c : t.toCharArray()) {% X) D6 x$ R0 o- ]6 L+ \' X" [
if (startSet.contains(target - (1 << (c - 'a')))) {. k+ W0 M% l( D w5 S- }9 G
result++;- s/ E1 t+ _% A7 u* I& O
break;" M3 W; L+ `" z: R0 v8 i
}
, x* }1 Z6 `9 q6 ~. a, U6 G! M }8 ?! U% D. H0 G8 O6 l
}3 T' |8 ~' A# R6 b% T1 ^6 l
return result;
/ {) ]9 F0 S" \! b3 X% G% d }5 }8 Q2 h j* u1 l6 Z+ \
* h) `( g5 H- k8 j; o( X; ]
private int toBinary(String s) {# ]( x8 Z* t3 A1 a1 t
int res = 0;% u9 w( G z$ \+ H
for (char c : s.toCharArray()) {) w. \; }3 C+ x8 G& _
res += 1 << (c - 'a');- N. [. V: f" Y! M
}' X p1 y/ ?% x1 P
return res;, U: `: t. B9 _' c% \3 q
}
9 S& C* W( v* O* m$ y! b( E: g}
6 Q+ b* R, K# E" ]" E" T( O4 O1 S! y8 Y5 M, y% C- S0 L6 z
( E n V2 n. d, Y9 G4 l: D
【 NO.4 全部开花的最早一天】
, ?/ ^: m* d2 y! l$ U
: X; T, ]- o( p/ b' p. g解题思路8 D* F5 [4 l/ X: R8 d, k5 Z
贪心,先种开花时间长的即可。
% P1 P/ U1 F2 y7 P% [" z% O8 g
4 ^- ]- {9 Q) |+ U! t代码展示
9 X* O. q* t; h# f @8 p( g, L" Q$ ?& A
class Solution {8 Z& s( L% U5 t
static class Flower implements Comparable<Flower> {
' M1 B; B7 C7 D& F public Flower(int plant, int grow) {5 C T+ V ~1 F# P/ {5 A2 Q
this.plant = plant;
; K/ w/ _% |9 X# `( X& a this.grow = grow;/ w! N- t1 j! g: y/ ^1 p
this.tot = grow + plant;' H! } [; t' l+ l. q/ w* O
}4 s7 a7 t4 a) n: k
4 T) g9 a& {7 C) ^# P% b int plant;
$ O6 ~# P: W" E$ n int grow;1 M, _6 W; b2 g9 w
int tot;
. u4 c; L, u4 w: A' K h8 \1 b' ~% I4 b
@Override
3 \1 N! X z' P0 D public int compareTo(Flower o) {
6 H7 f* a1 x0 Z/ y- q" l1 }( @ return o.grow - grow;% ]- P* ]! J% g7 _4 `2 B$ x# K
}
/ y6 q# l$ Y1 U. c# o% U. Y% D }+ E( l& E6 u* V+ L- @4 {+ Q
- \6 q7 k/ K6 Y, b) z
public int earliestFullBloom(int[] plantTime, int[] growTime) {1 P6 j) U) V3 A5 a3 {" r! b
Flower[] flowers = new Flower[plantTime.length];0 H8 X2 ?7 m, |# @; A" }
for (int i = 0; i < plantTime.length; i++) {; w. n" c+ u! x* ?6 p9 o G2 r
flowers[i] = new Flower(plantTime[i], growTime[i]);, c5 `9 X k0 U( \
}3 x6 w! w, }( B0 M" W5 m
Arrays.sort(flowers); p3 d' `: \, l
int result = 0;
* c, |) m, Y5 S9 f @$ h int current = 0;5 e% J' m7 s4 l% ~
for (var f : flowers) {
. b* Y: w M& V! k: e result = Math.max(result, f.tot + current);0 Q7 |% u2 L$ g5 v3 a% H" D
current += f.plant;$ l, s7 D m% ]+ O9 l) K; b9 A
}0 {3 z& t2 s( ]4 ^
return result;
# J9 J$ i6 W' ^$ m! \7 f7 ` }
$ R1 Y. o. V7 |4 V" G3 _}
" F% D5 w2 P5 J$ m9 q |