登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集
5 @' \, m; d- a4 o) _' w$ j% h6 Z$ G: k* k8 f/ g
使用 Set 求交集即可。/ l; @& |- t- \" G, n( @* r6 P" a X
4 t( T8 d+ M/ B# n) r```Java
$ ?* ^7 _1 g p4 ~class Solution {
/ Z, I; T5 z& h% Z$ C& h2 Y6 y public List<Integer> intersection(int[][] nums) {
! { H9 Y+ f! j, K7 ]5 N% F: o List<Integer> result = new ArrayList<>();9 o1 G; C9 N& W: y% S
if (nums.length == 0) {
" I" @4 [6 Y" p) ` return result;4 \2 F. x, W. r' O. }- p4 r/ O5 d
}
0 n: D- m2 J! d0 C j List<Integer> list = toList(nums[0]);+ x! s. |7 |5 n$ ?5 t- R
for (int i = 1; i < nums.length; i++) {( y- u" j4 D. z( u' [
list = intersection(list, toList(nums[i]));. N- a: a E z6 s. r
}
" p! I$ c" f/ p5 | Collections.sort(list); c5 u' n) C u' k
return list;
! o% ~; u/ W. r* U. ` }
+ e0 W0 x/ L) U. m, |
, }5 G3 `4 A/ x2 h+ k- x | private List<Integer> toList(int[] nums) { C/ `' Y7 y( N L: @3 C* N) ?
List<Integer> list = new ArrayList<>();
3 X T5 y6 S' s0 K5 W# P for (int num : nums) {
7 s5 u& q4 s1 ]/ K! ?0 l/ G list.add(num);5 a: m [) O C1 w
}
+ X; k, e" `% h0 c, O2 F# z return list;
' B( U4 j! q3 P# B }6 |# {' P0 h, C# o5 q' v: V; u
! |/ {" ?$ C+ A& v: R ~
private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {! @! J0 I. H$ M
List<Integer> result = new ArrayList<>();: _0 g( ^$ W) X- a; x
Set<Integer> set = new HashSet<>(list1);7 P; @8 W1 g+ Y, Y5 u
for (int n : list2) {
- R e7 ?% z* K6 ?7 j if (set.contains(n)) {8 H8 W- t1 k0 B2 W
result.add(n);
; p" l, [3 |- o5 W% h8 p set.remove(n);
5 Z7 a! `: b- f+ B7 x }$ I' L. B4 @7 L7 M+ n9 F. o
}
% X+ b0 p9 w- i return result;3 J4 L: {8 c1 t6 X! G3 R" \' U- E
}9 M5 E5 ?+ w8 Y2 R! ], }4 H
}
' g, z( {% t$ i```
, v/ R w. K' F$ X2 P$ G1 I k( l8 V. M2 V! e* L! ~7 X+ Q( y3 u
### 统计圆内格点数目
' |: P. r5 J- h: B/ j6 T2 a
/ M8 a3 ~" @6 C( x* R4 U3 }枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。4 C6 }3 D- _" I9 N
: f# h# X- l2 C( q3 E! B2 }
```Java
% m, C! w$ k+ c. n/ tclass Solution {
1 n3 j! [( V" T public int countLatticePoints(int[][] circles) {; w# i5 a9 I6 N9 K* H, r
Set<Long> points = new HashSet<>();
* }6 a0 y( i# ^2 _4 h for (int[] circle : circles) {
9 Z$ K8 Y' k: ~1 c& y2 F! } int x = circle[0];1 x( t7 l$ o5 [* A) P6 [! p; c
int y = circle[1];
! D- A8 [# B4 p8 P$ l B# R( ^) ~3 Y int r = circle[2];
6 h3 ]: L: s u( I // 出于便利,直接枚举正方形区域,然后判断是否在圆内* w- D/ I r/ F% Z$ X+ D5 T' \
for (int i = x - r; i <= x + r; i++) {
1 p. ?2 s; }4 |( A' b5 a3 @ for (int j = y - r; j <= y + r; j++) {/ C7 d: I) Z5 E) t
if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {8 ^7 J+ m! _6 _: D
points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标3 g4 O" c6 D- F4 X0 h
}
9 D$ B* L# N. [: I }
M) `7 |$ q: J4 p9 Y) L- y } m* u3 Q" h, ` h0 @" ^8 k
}
5 o# a/ f) O7 i7 D k/ _; V4 V/ R6 Y return points.size();
. H, y0 \! d' t- ` }
# O! T; S$ G. E6 h, r}- e) |" \3 L' r7 _ H3 X1 c3 m
```& G* _9 P3 F$ E) Z0 M+ ~
4 l ?! x8 u x( _& o" ~3 M4 p3 Q: [### 统计包含每个点的矩形数目
7 U/ d& z0 l, E
) }" o( z+ T+ }. c0 R( D. h' ?与第四题类似,只不过变成了二维的。! X) O3 r' {& p$ k' P
. v+ z+ V' p! G8 ]4 ~6 \先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。% [( U- W2 ~ q; l- s
! D" b3 m$ n1 Z8 T' F) n
```Java( t4 N% N: j6 x p# ]% \9 s
class Solution {
+ V L& T" M8 e3 _: \ public int[] countRectangles(int[][] rectangles, int[][] points) {1 A, ~( l: _4 c
List<Integer> xs = new ArrayList<>();3 ]2 [6 L8 K6 W- Q3 ^2 P
for (int[] point : points) {: C9 e" v" y. D4 n$ F5 x) y/ a7 s
xs.add(point[0]);
2 X: h7 X; x, l- i# ?0 y) J. } } ^8 b! R: A2 [% b& K7 w
for (int[] rectangle : rectangles) {
& y% G F5 L+ S5 w5 s! V& k0 z+ { xs.add(rectangle[0]);1 W8 p, G# |3 |( ~5 u& v' K' N' @ \
}* @( d, N' l' f, e
Collections.sort(xs);" G$ ]7 D+ q. x7 L5 g1 z
xs = new ArrayList<>(new LinkedHashSet<>(xs));
) |! l) ]' x5 Z3 V Map<Integer, Integer> map = new HashMap<>();
% s5 Q; h! @8 q; S/ S. N for (int i = 0; i < xs.size(); i++) {$ |, R" l, `: G
map.put(xs.get(i), i + 1);
' ?5 t- f; G& s- M+ C+ |6 n }
0 n3 y9 i- i! |- ]" R* s7 b: G, E$ K8 g for (int[] point : points) {' U7 d. s" I0 F
point[0] = map.get(point[0]);4 S; g* R$ K+ Y2 Q5 l
}
) B# `. ?+ j. ^8 c6 w) S for (int[] rectangle : rectangles) {
+ n2 J& r/ ~7 [* v6 m rectangle[0] = map.get(rectangle[0]);1 R$ X+ W6 }! K$ j
}
9 Z- ~' y' ^7 u+ f% L# }* C/ J2 j int[][] g = new int[100005][105];
4 F) [2 S5 F* i2 W for (int[] rectangle : rectangles) {& j2 i: v. {$ j6 v
add(1, 1, 1, g);
: V: ^( i" u9 t) O& b( ] add(1, rectangle[1] + 1, -1, g);1 l' A& j5 I( a$ }; [) P& {: w }$ K
add(rectangle[0] + 1, 1, -1, g);/ U. D3 q1 [" O& @- r% \, |
add(rectangle[0] + 1, rectangle[1] + 1, 1, g);9 c% L& I$ G! {% [% y C8 }
}
" x7 l& _& H& m: L3 ^ int[] ans = new int[points.length];
5 j$ P$ a5 {* A0 g9 _0 B# z" J for (int i = 0; i < points.length; i++) {
$ W3 }2 C! \' a ans[i] = sum(points[i][0], points[i][1], g);
$ w- ?7 N l; l3 x, m( l' ] }5 m+ _, ` U: N& W; z' L/ v& `
return ans; n; N7 w6 C0 w! o
}
) d1 Q8 o) K$ C, F
5 B" s) g3 L: J4 ]2 Q private void add(int x, int y, int d, int[][] g) {% f* C7 A B, h$ r5 l7 Q
while (x < g.length) {
/ w3 `7 z! r, N: T' M, X, C1 e& n for (int j = y; j < g[0].length; j += lowbit(j)) {9 t# u7 C- n" g! ^% z j$ \
g[x][j] += d; C, }$ w& s- k3 A& Q5 C2 J
}, K( N* j5 f) T5 l
x += lowbit(x);: Y+ D9 o. M2 m! c& a8 r* L
}, e0 |; P" A& `! K" o2 C6 r
}
) N6 {8 R, ]( N; T% K
- C5 f# a' ]0 A5 `4 a private int sum(int x, int y, int[][] g) {
6 ~8 [0 i4 h; C) O! z: f int ans = 0; l. [* P2 S5 d
while (x > 0) {
) |0 s+ E- n3 }4 K* n* b$ i* U8 ^ for (int j = y; j > 0; j -= lowbit(j)) {5 b7 V: `! }: c( r' ?" { j3 i
ans += g[x][j];$ i6 p- Y$ L7 i& r+ B
}
$ ]$ q$ ], n9 ]6 S& B: a, V- c N1 P x -= lowbit(x);
: k3 s: ^' e0 Z3 D; n }* z0 A1 }' ?% M" h/ y" o
return ans;
+ b B) y- ]2 [) u) ~ }
! C" o' D- Q) p6 }& c& K' [. }# g$ C' J2 m
private int lowbit(int x) {0 s! Y6 l' }7 Z: v( I; _
return x & (-x);9 A: H3 [7 S$ S' u- B3 w5 E
}
8 Z# P7 A$ d0 i# s+ ]2 [}1 g. j- J' c2 ^( A! o3 ~# C
```" }" B# I1 S( q. U- T- Q
, u+ S2 D, _- d: Z
### 花期内花的数目
( ?. h/ i# R5 D- A" h& _# M* ~5 W j9 a2 X
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
# ]8 x) ~( Z& l8 e& w0 Q! _& X i: C
比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
1 `% }( G8 N8 ^* v/ {4 Q- y- Y, i% S
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作: ~* q- E! x; t, N! Z. Z3 d3 i
5 h$ ^" P- M0 p" D. h- 给区间 `[l, r]` 加上 `d`3 B* c1 f3 B5 g* N+ D: u* I
- 求点 `x` 的值
# ~3 @2 \' C) m0 e$ T V' }
8 ]% S6 M: t P1 W相当于使用树状数组维护 flowers 的差分数组的前缀和。
% Q1 G+ r8 Y! p( q2 o; t& g8 w, P8 S* N% [
```java
3 V9 A/ W; X( ]6 Hclass Solution {1 x- r7 c9 [0 y/ V# \
public int[] fullBloomFlowers(int[][] flowers, int[] persons) {9 V! D1 @$ p0 C$ c* O
TreeSet<Integer> numSet = new TreeSet<>();0 H" H, ?1 y+ X' K1 z6 @- K5 Q3 B
for (int[] flower : flowers) {' ~# A( W5 C/ v- ]
numSet.add(flower[0]);
L( |2 _. q9 U- l& ^5 O numSet.add(flower[1]);
- `( k! `5 N+ y+ l( e }
# Q0 e: f% ?: o9 b' w for (int person : persons) {; [& S7 _! d; @) w; m d! ?' X
numSet.add(person);, C( K- g) b+ Y& d6 \1 Z( p& v" D$ f
}
2 W7 k& X" t+ t* ?( l* H5 G Map<Integer, Integer> numMap = new HashMap<>();
% f( a; L# X3 r1 j for (int num : numSet) {2 u5 m% b+ @, K3 y2 m
numMap.put(num, numMap.size() + 1);
L. N; T9 q' s/ P- p, A, Q- l }
4 T$ v& [' A; Z" K7 ^ for (int[] flower : flowers) {: p8 h5 C4 g1 p" j# A- H. Z& u
flower[0] = numMap.get(flower[0]);
8 `3 B' ~6 d) Y3 l( V. s flower[1] = numMap.get(flower[1]);$ p( Z2 W8 k$ ~9 Y3 j7 b
} e% S) N% h$ Q9 t6 G& @ g3 k
for (int i = 0; i < persons.length; i++) {+ o0 W9 |$ F3 i# w8 O7 e5 Y
persons[i] = numMap.get(persons[i]);) B$ G7 v- N( Q \& P1 T
}
" Q$ X7 B) [; |+ X( \) d( P- ] // 区间加和,单点查询
( C" p* D" E8 y int[] sum = new int[numMap.size() + 5];) [# H3 y( ]6 T. h, z
for (int[] flower : flowers) {
7 l, d, Y: l R; ^/ u add(sum, flower[0], 1);
; u( \" M8 V9 `0 W2 p8 r add(sum, flower[1] + 1, -1);" r0 d9 p( k' F) l9 j3 q* z# I3 w
}$ A" n% k# E( p. X
int[] res = new int[persons.length];
1 y- b3 _2 }; s* j& ?# X' s* W for (int i = 0; i < persons.length; i++) {' Q* b, `" y! z( j
res[i] = sum(sum, persons[i]);
7 {) E7 d. r: m" T: p5 x }
8 F6 m% @: e6 z$ p' u; n return res;
% W+ I: {3 H; i0 y! D" e/ @ }
! U) }+ p) Y# G0 ~. M- p, E9 D: b9 t3 f. |, j' i) X% ~8 t+ ^5 n
private int sum(int[] sum, int x) {1 E9 F: M4 G0 q
int res = 0;
' n4 M9 k) t8 r- r while (x > 0) {
7 n( Q1 |, b4 R* W$ C res += sum[x];! X% H9 Z M: y* \, ]
x -= lowbit(x);
+ N q& u* p. |. ]3 b& Z! G }
3 [3 @6 z- t, t4 q" h- S- g return res;
! M' z, _) E$ z3 k1 h! G! N4 a j }
! J1 J! g g5 \* s2 Z; _0 m% C1 i) u
private void add(int[] sum, int x, int val) {% p$ M, X7 _& q# Z0 E: [
while (x < sum.length) {
; N- }, r0 v1 y1 L7 J$ Q" S2 z sum[x] += val;
$ m) q8 A' q+ o; m& J x += lowbit(x);
3 h/ W; N* C; P( Q }% @9 n) k' ~1 x+ o4 B) `
}
: c6 T3 Z7 S& o' M
8 G- ]. L* d! J0 i) ? private int lowbit(int x) {+ m: |" X1 y2 s- {8 K; F4 y
return x & (-x);
: P9 @) V! P2 a. B }
$ f8 s* l4 J6 r% P. H. H! ~}
7 f; n3 [/ P! C+ W- K" l0 a1 O |