登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集9 Q6 K* x* M+ L
$ o! g- a: X% Y' y: R
使用 Set 求交集即可。# b! t$ y8 n) |# E$ q, O" x
# a8 o* g4 N8 K- T' I; t```Java
7 l0 X8 P4 s+ x& O8 Cclass Solution {; ^* L4 }: C2 Z% h6 b Q
public List<Integer> intersection(int[][] nums) {$ j* f; r8 [7 C) j. B$ \/ o7 \( U
List<Integer> result = new ArrayList<>();4 x! y" l9 Y: s- O1 u6 ~
if (nums.length == 0) {
. s0 O) u2 A/ g9 R' o. V' O) ] return result;
5 L' w |. A+ z" n3 V: h( o }
9 \( |6 s2 l3 e% \$ p! b4 a% j" t List<Integer> list = toList(nums[0]);" ]" z8 a8 y$ C
for (int i = 1; i < nums.length; i++) {' G" b3 D6 {0 k! c
list = intersection(list, toList(nums[i]));7 Z% W9 D# b, S
}: e9 U1 u# {" w% n8 \, D
Collections.sort(list);
+ M: l3 }4 h! e return list;, j4 W: v4 G7 K8 v% Y/ H
}( a, P- m/ I, V& g1 S; k
7 Y, u$ F. b$ l/ T private List<Integer> toList(int[] nums) {* I; c1 E6 J v! f0 |
List<Integer> list = new ArrayList<>();7 ^& _/ J" ^ i7 a* d- M
for (int num : nums) {
/ J" {1 [, G8 f) e- v# ~. t5 k5 G list.add(num);
* F$ i8 }! p6 p8 [% b' `' B }
5 X) T, d! ]# M. P return list;
: r/ `& z5 O2 e6 _, ^/ `5 L/ X }
+ `* B; i! x, N. S! g m. w
! o; i3 ^. P! K/ {5 @0 a private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {( |1 [1 Y, U1 M1 q& o7 y- u
List<Integer> result = new ArrayList<>();
# W5 G: f: s6 D Set<Integer> set = new HashSet<>(list1);6 s3 v( ~- h& x; V' {
for (int n : list2) {+ c* L2 l4 u- U
if (set.contains(n)) {
" o! Q5 ?4 x) y5 C7 z8 _9 { result.add(n);
4 E1 }% W3 L& K b/ s a set.remove(n);( O/ z. ]1 \. `5 [% f
}, _+ J5 M5 w% ?' O- V6 t7 D8 d
}( |0 i+ p* N9 H" j' h5 l8 B7 P
return result;& h X1 i/ ?& j" ]' ]
}
) P6 N: A. b* v4 r9 o}4 p( K! y4 J# A; C" L( G+ V7 y$ I9 y5 t
```
7 E1 ^- R/ g% w! c# ~
4 l7 h Z6 G9 I7 t### 统计圆内格点数目
& j% g; o0 V& T R) k! a
& e4 W8 a" M8 |* B' ^枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。
" i8 g4 a, g8 ]* |) u* @# P: I" D
```Java
+ C2 X' W& C7 |class Solution {
3 ~" S, ]$ i D) @! ]' A public int countLatticePoints(int[][] circles) {
! e. N0 [( Q, Y$ z7 N& U& i1 ] Set<Long> points = new HashSet<>();
/ R1 ^6 E* |9 u$ x u( V/ ~1 _/ g for (int[] circle : circles) {
# m0 W- s, a$ l, @! s int x = circle[0];6 h/ {$ W7 s, r' |# O
int y = circle[1];
, U: b' ~6 \: Y* w5 D int r = circle[2];( _: r9 u' b8 e" [, l/ m' D
// 出于便利,直接枚举正方形区域,然后判断是否在圆内
. J4 C- b- e6 l for (int i = x - r; i <= x + r; i++) {' w4 J+ ^- [# L4 t- R
for (int j = y - r; j <= y + r; j++) {
8 p8 d( U5 f& O- k8 u9 c if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {- T& x9 V% t: e
points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标0 ^. G5 |( S% `
}
0 |* Z m0 r; { b* } }7 f/ t& \: M, a% P
}7 B: R, U. r! w, B, l6 `
} F$ g1 X s( f; |, M6 T+ O
return points.size();
5 z7 K4 n' P2 {% c3 I }+ x- \$ D1 E7 `" k$ j5 S
}/ K& I: |0 t/ N. I8 V5 N
```; o0 B5 f0 U! F7 @' O, X& i
! z! X5 X7 e. T3 q0 Z6 v### 统计包含每个点的矩形数目
( j( X8 c7 ?* ^8 k, I& n
/ S5 H1 W" q7 \5 m, b与第四题类似,只不过变成了二维的。
5 p4 V0 m8 t4 @8 ?% h) b& @% z& s6 S! T a7 w, Y6 j* e
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。( }7 O1 F1 T- ~6 N2 x6 [* U
; _7 r: ? b8 B, H ?! D```Java5 j- r# ^7 e, [" V1 i6 k8 W8 @' \
class Solution {
/ g# k+ ^5 h, p! d$ M) I% N public int[] countRectangles(int[][] rectangles, int[][] points) {, a- O' i, |" @8 |* f
List<Integer> xs = new ArrayList<>();* _* k3 J% L# p4 g L! ?' B" c: ~
for (int[] point : points) {/ G0 Q% b7 \# M# v+ _5 I
xs.add(point[0]);
( K1 B( z/ Y$ N- S2 H }3 \+ J- n5 t, I
for (int[] rectangle : rectangles) {
, y( Y* f1 B Q0 N: I } xs.add(rectangle[0]);
; o8 i; W1 a% ~. k( g! M/ W0 R9 D }, D+ [$ l( Z; a/ M7 B
Collections.sort(xs);
% T" l ^# l9 w; @, S; e xs = new ArrayList<>(new LinkedHashSet<>(xs));
3 k4 n. z) g# M7 u! n Map<Integer, Integer> map = new HashMap<>();
! |% F% ?: F- a) N I: r8 ?- Z for (int i = 0; i < xs.size(); i++) {6 _* |0 |6 s8 v, l& p
map.put(xs.get(i), i + 1);
1 d6 V, W, s, R! N, ] }
) w7 v( S; R* y7 `/ Y6 n for (int[] point : points) {+ i; x' k' x% o0 X% B, ]
point[0] = map.get(point[0]);, v* p/ p4 L; `- ~( y
}/ `( |# y- |4 a6 K# Z
for (int[] rectangle : rectangles) {8 h+ n* E1 B6 p3 N2 S
rectangle[0] = map.get(rectangle[0]);
# ]1 j( T6 }% T( G# K }
* y% x: g0 G; N. T( \ int[][] g = new int[100005][105];
; F! A" I$ C! _' G: Q6 i: H' X* W for (int[] rectangle : rectangles) {
6 g0 @7 q: N" l6 N" ` add(1, 1, 1, g);
3 G2 S/ V5 ~. R( E add(1, rectangle[1] + 1, -1, g);
/ G9 t5 f2 g e4 M/ | add(rectangle[0] + 1, 1, -1, g);" V, V( c0 _9 D7 p; W+ D
add(rectangle[0] + 1, rectangle[1] + 1, 1, g);7 r, t# \# c3 Z
}
& g) w+ k9 C! k( U4 L) M int[] ans = new int[points.length];1 R7 w# f' N$ \7 [1 }& K
for (int i = 0; i < points.length; i++) {- v2 I4 t, Y5 J ?3 G8 F9 c0 S7 X" P
ans[i] = sum(points[i][0], points[i][1], g);6 U4 { ]) Z( A/ r
}
+ l U, D5 G/ ?; t [ return ans;
6 F5 q, M$ K! d! h" ]% @) A! c( H( a }
2 O O+ U0 S9 b' n3 V& F
) f* z% J7 U' c0 ] private void add(int x, int y, int d, int[][] g) {
' k- V' E9 r& N+ W while (x < g.length) {
5 Q& [1 L# Q/ ~3 U- @4 [ for (int j = y; j < g[0].length; j += lowbit(j)) {
* ^. M0 M; V+ q2 I/ V$ V g[x][j] += d;
" t( Y7 p1 m8 y ? O }& [9 q# d. [$ N; A
x += lowbit(x);) f$ W$ L8 y8 v. P& j1 ~9 i7 i
}
4 I% f6 S5 d# V3 r }
4 B7 i. v2 t. Q" U
+ m) [% ~1 o) T( z private int sum(int x, int y, int[][] g) {" `2 S6 Z' M" n8 [
int ans = 0;! X" v) Y; ?- V2 ]* [% N8 @0 T
while (x > 0) {2 b4 U7 e( e9 g4 _4 J, p
for (int j = y; j > 0; j -= lowbit(j)) {
7 D/ q# T& Z( V1 ]9 l1 L1 s ans += g[x][j];6 S( ]" \- ?- F+ |7 a
}4 c) D6 n+ l; U
x -= lowbit(x);
, F; u( {' V) `9 t$ V: K }8 F- V$ i! g4 E7 S [" W' V2 B
return ans;
4 c1 u! E8 t t" x/ b, g+ E: J }' Z9 T& z7 l5 e3 v9 |
. s5 S- ~, @% U& U) z& ^: U private int lowbit(int x) {/ N" O* U) e0 I3 F6 }
return x & (-x);( m9 f9 u; E0 `# a! s
} N" m9 D0 `" h7 F4 q
}7 r- c( n7 K% ?6 h
```+ A+ ~5 N! }$ w! q
* {9 _0 s4 L% q) H: S: { `### 花期内花的数目
$ G. |, E' z! J: X1 n6 |- c8 u5 X/ @1 }4 Y8 _) k0 G/ b9 C
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
% e5 r- ~8 p. e9 ]8 q4 X( f$ G- ?5 J' @: O7 h& f5 r% f" q
比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
8 U% [! s) H$ z( J2 F# v9 y. m4 {% R- ]# m7 W
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
/ G# y5 c6 k4 y) k( w. F' a3 I$ o$ V6 Y2 p9 a% g
- 给区间 `[l, r]` 加上 `d`
' [, O: g0 h- d/ J8 h- 求点 `x` 的值4 U( Z G& N( `' l. X- M+ p
; f, X) n! k5 ]) o
相当于使用树状数组维护 flowers 的差分数组的前缀和。4 I/ P$ ?0 p# s2 z9 ^9 ?$ z
! c, @4 a; N P }% B
```java4 ^) G( |/ W* Z6 S
class Solution {7 i6 t8 P5 p, Y& \. |; W
public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
5 n& a3 C( v, `4 }0 m3 i" P6 K TreeSet<Integer> numSet = new TreeSet<>();
7 q! N* \( E) q- Q for (int[] flower : flowers) {) V7 ^2 f8 p% K+ }0 j# U6 s
numSet.add(flower[0]);
4 b; {- R) z" c: B; P/ y numSet.add(flower[1]);: ^6 R% F1 ?/ ~; j2 u! Y1 Q/ N! r
}
9 T* \2 n$ ^3 s( L1 T for (int person : persons) {
* G8 E4 j Q9 _4 I+ x i numSet.add(person);$ t: }! Z" E) @" U5 z( h: a/ @
}
5 B: L. a) b# f; D Map<Integer, Integer> numMap = new HashMap<>();
; z2 {) e* b4 q: K; j: E for (int num : numSet) {
1 e( `' ?2 _6 t2 k numMap.put(num, numMap.size() + 1);9 h4 ^8 Y+ r& L" W' Z3 {
}
$ o- T" E: ^! H% x7 p2 h) O for (int[] flower : flowers) {% }4 H* z3 {3 w l
flower[0] = numMap.get(flower[0]);
" ^+ \6 B7 V6 }0 Q. C) B flower[1] = numMap.get(flower[1]);! E6 V) m1 S2 S: v2 x/ l* j
}
2 K9 S* `. J* `& d) j& F) n for (int i = 0; i < persons.length; i++) {
3 p* _; X$ P: N6 W& Q persons[i] = numMap.get(persons[i]);4 M+ {0 W- `; R* ^6 H: E2 p
}
- i/ ]4 \9 {* \) `9 Z. Y' m1 ^ // 区间加和,单点查询
* {& W2 _( `; u9 V int[] sum = new int[numMap.size() + 5];
0 q8 P) u& [4 ^ for (int[] flower : flowers) {
) W% j, `/ N4 v+ D: F5 e. H0 a& p/ t add(sum, flower[0], 1);* z" H! f' p/ z7 i8 j
add(sum, flower[1] + 1, -1);; ^) k. y& }6 v8 R4 k; z: q9 [7 H
}
$ N( V# H1 n6 f p5 t int[] res = new int[persons.length];
, K5 l- J l& n; l0 y0 ^7 _ for (int i = 0; i < persons.length; i++) {- U/ e0 u+ b4 C C3 \
res[i] = sum(sum, persons[i]);, ~3 ~8 w/ d/ T" ^* ]( O
}
( P% z2 O, D+ N return res;. M6 d* I2 p/ n$ y# h$ A
}
; O* F- ]% M$ l' H) {6 i* ?- l9 q
private int sum(int[] sum, int x) {
: z5 a* F3 m/ q* { int res = 0;/ Q7 X) _6 ?7 }; [! w/ q! h
while (x > 0) {
" d, s: j) D M# h3 W, Z res += sum[x];$ U5 @% S( h) `. n- Y' L& l
x -= lowbit(x);: [# z5 @+ S- D- N9 T( i$ d
}
+ F5 O7 Z; H. `( {! c8 f return res;
; f) m9 a7 i( y. W }' M d' R( @5 S* t5 k
1 I2 b2 M2 K3 ~/ @9 t" U private void add(int[] sum, int x, int val) {
q, H6 \/ [7 d% O6 L% }9 a while (x < sum.length) {. ]$ K! t# O0 L/ z, Y
sum[x] += val;& |: q' F9 u9 q$ h' {" m
x += lowbit(x);
2 D, I0 m! M7 d% m9 Z ? }
+ u2 P/ ^# N9 c4 E8 D }
# h5 |' x5 C3 f; L" q# f
. u" X7 Y6 j8 `5 {6 y4 `9 k private int lowbit(int x) {$ `. P4 \- l6 P4 K) P/ l
return x & (-x);
3 X; D4 b6 G5 Q- u }
" ]1 k& J$ a8 P! A9 ?}
2 I x: j+ u6 B( @ |