登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集9 Y @( r1 K0 ~' T" U7 s
/ s7 L5 q. W" Y/ [# D
使用 Set 求交集即可。
% F# R& E$ v7 m! J3 A1 z7 |- ?& Q z6 \+ a9 J* h
```Java: A- Y7 ^* Y: M7 u' S2 M
class Solution {
+ l- ?$ M) e: L! b& {2 v2 s# Q public List<Integer> intersection(int[][] nums) {8 ?' r, w8 k: e+ o0 W
List<Integer> result = new ArrayList<>();
# f( X$ [" _4 k/ [' H: L2 ^ if (nums.length == 0) {/ c( R' m) q# C$ a1 T0 n3 F
return result;
0 }& u6 F9 g+ v9 J6 i' Q7 P }
, Z2 E" T$ P5 G4 \ List<Integer> list = toList(nums[0]);
" W( e1 L, s- S" F8 O for (int i = 1; i < nums.length; i++) {- f9 a1 |# I8 p- ~
list = intersection(list, toList(nums[i]));
+ Y7 ^7 k* e( R4 W8 r }3 W$ T3 _( J. B; C# S
Collections.sort(list);2 ~( `/ L& g" u: U: X0 i7 V+ q
return list;4 P7 A; Z8 f7 G0 p
}
2 Q* f; d9 }: X7 O. T
2 s4 w2 N% l$ A9 V+ t2 n y private List<Integer> toList(int[] nums) {
1 t W" A3 d+ B. ?3 t W& A List<Integer> list = new ArrayList<>();
* K/ j& h3 k( D# }; i8 t for (int num : nums) {$ l5 _* m! Z& J5 k
list.add(num);
: ?' A" i- T1 S# d8 p }- u; { u# k) w3 c) ~
return list;
4 n% [) O: q8 B/ l: X }" ~6 j7 O! M7 S. [9 g( n
' h8 k0 c9 J- q5 q0 R* v
private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {9 G3 T7 d4 @3 \& X! E
List<Integer> result = new ArrayList<>();4 ]- |- c8 l, [8 e) \
Set<Integer> set = new HashSet<>(list1);7 Y9 A$ }* B; [6 h% Q, C# S
for (int n : list2) {
8 P" ]# j6 J0 Y6 s) a3 \! t if (set.contains(n)) { R; t% S7 V/ ?
result.add(n);/ ~; e6 M; D ?; W% H) _( s
set.remove(n);
' L- C k- [) Z1 t }* y1 n8 T# z' b7 v
}
" s- x! B1 k! y; n9 s5 v return result;3 g1 y4 @0 j" W; a4 Q7 ^) Y0 ]' h
}4 Z' T2 r1 }5 @7 ^
}
5 V: W; p5 o2 h9 K. H" N6 p8 G; s% }```) s! E6 w9 c) Z2 ]
q, S) e$ b0 n0 E### 统计圆内格点数目1 j7 g$ S1 t' w1 [ x
. h: }) l+ E/ f( ]枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。4 } o1 m# |& m' P t
3 B/ x0 g! e& l) s( X+ k```Java
- y, L. e8 q8 {3 Dclass Solution {$ r2 C- @) F2 |* R7 J
public int countLatticePoints(int[][] circles) {
. C* C2 A1 y* v Set<Long> points = new HashSet<>();
+ V8 L4 M' v- _! e for (int[] circle : circles) {, E. ~% O5 K# `# M
int x = circle[0];
6 ^7 I) b% ]: W int y = circle[1];) T4 E7 v9 d; I$ V
int r = circle[2];$ C/ X3 N3 e( n! V- P6 K
// 出于便利,直接枚举正方形区域,然后判断是否在圆内7 e+ U6 {# J# \( f- a' y, M
for (int i = x - r; i <= x + r; i++) {
6 G3 x/ x) T+ \' t0 K- |; m for (int j = y - r; j <= y + r; j++) {( R9 f* ~( U5 e& d2 z( J+ L* c
if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {
0 ]2 ]2 c) c; G+ c ] points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标
2 e* a. W+ o2 H8 W3 n }" G& V$ T! h- ?$ w; m3 c1 \" @
}
! n3 l. u V6 H/ y( n }6 \4 }! ~% l, S- k0 g
}
; j9 @ s: P Q2 e' Q return points.size();* d) O7 ^0 J+ Y; E1 q& U8 z
}/ ~1 F/ p M; s1 V0 [
}8 W, x) y" C+ Z- N. V
```
# m6 E: u* L# c8 ^! X0 W' Z/ F0 W" @; i- L W6 P
### 统计包含每个点的矩形数目! ~$ v9 ^. z7 H3 q
5 I& j4 Q4 w& l' ?3 Z3 J) f8 `与第四题类似,只不过变成了二维的。
1 @8 k6 I. K1 v( v5 Y; O |3 |5 @' {9 B; O
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。
A* ]$ v# Y- K, z0 a
. y7 k8 r1 t7 \$ h0 f/ e```Java
1 P" L1 R, b6 u5 [+ y- kclass Solution {! H- A2 N/ f4 {- V" J5 K5 A# m1 y
public int[] countRectangles(int[][] rectangles, int[][] points) {
2 @7 s+ S" B9 Q% n List<Integer> xs = new ArrayList<>();+ Q( t" y, C1 \/ I
for (int[] point : points) {2 c0 W+ ]: B0 e5 z/ w
xs.add(point[0]);5 T; U* y9 f4 _
}$ y5 T, S+ j |9 h, d
for (int[] rectangle : rectangles) {) ~! \& Z; w7 X) |) f ^" l3 m- ~
xs.add(rectangle[0]);
& t2 ]5 w( E, K, y# W }
9 T+ A# l6 K1 |, B Collections.sort(xs);
/ T, L4 T) T4 V4 | xs = new ArrayList<>(new LinkedHashSet<>(xs));
, [) q1 i2 f7 u1 y Map<Integer, Integer> map = new HashMap<>();
+ ~- y& `) @+ r- {4 _8 Z! ?4 n" p for (int i = 0; i < xs.size(); i++) {
: N6 g n+ [. @7 f. I! w3 i8 L map.put(xs.get(i), i + 1);
5 r( [( L0 E) D6 A }
1 m' z9 @. E) }" @0 b- v for (int[] point : points) {5 u" g" l( v& n+ Z6 C2 Z2 K
point[0] = map.get(point[0]);
6 a1 G1 L; \ d }% B( k3 J, s9 O& p* F1 c5 @
for (int[] rectangle : rectangles) {
: u; L7 g) ~8 x. ~' P3 a. T rectangle[0] = map.get(rectangle[0]);+ V1 P4 N( l( B. N# c
}
! S. [6 R# f) K7 M9 c$ S int[][] g = new int[100005][105];$ S! \9 Q) B8 m0 q3 |+ n- w% E
for (int[] rectangle : rectangles) {. [, J" I5 l$ s( ?' R/ l
add(1, 1, 1, g);3 _( d0 s' }9 i# x) N# C
add(1, rectangle[1] + 1, -1, g);, Y: j/ |4 v2 a8 C& U2 x
add(rectangle[0] + 1, 1, -1, g);; |5 i' f4 A4 d) ]% g% s( K$ e
add(rectangle[0] + 1, rectangle[1] + 1, 1, g);
7 I' {7 b6 a; y: E/ q4 @- M6 z" G }" V4 _& F, v4 Q! a8 X: T
int[] ans = new int[points.length];
, @$ Y" h$ a+ @0 N for (int i = 0; i < points.length; i++) {
; J9 H R4 j8 j3 @; \ ans[i] = sum(points[i][0], points[i][1], g);. D" N/ }+ \) H' G K- M
}2 z0 R9 s1 V. H0 X7 c& _6 M+ r
return ans;
0 s2 |% k6 i X, h5 P# Z }; Z, _( j. I& d* ?- F3 j1 T, ^8 ?
0 c6 ^0 |2 b; O private void add(int x, int y, int d, int[][] g) {6 h$ @% l: R6 X! f# X* J
while (x < g.length) {' W6 ~: g3 m5 v( {" g, B* s) m0 Z
for (int j = y; j < g[0].length; j += lowbit(j)) {
, W+ Y' T7 K* Y g[x][j] += d;* c2 F! V9 u# A3 P
}
0 ^" S% v9 U8 J% z7 g x += lowbit(x);+ Y; Q1 N6 k: u5 y- }- ]
}7 h0 h6 G t1 ^: @; b" l
}
# @8 R" c y* d2 P: M' b6 q
9 ]6 y4 X4 z9 v! V+ Q* W private int sum(int x, int y, int[][] g) {. w) E0 Y9 o$ g: L$ y
int ans = 0;
% d9 U9 [/ t+ \3 C: B- c# r/ k while (x > 0) {& p2 m; [/ _ _4 Q7 O# Q3 J! n& P
for (int j = y; j > 0; j -= lowbit(j)) {
2 H2 m5 ^7 j; X% r$ e% f ans += g[x][j];' O$ ?% H1 k3 F
}
0 X/ x& F7 w& f: U( R! f; {1 m x -= lowbit(x);# ]7 k# y- g4 f. V
}* }/ [! l3 N( A
return ans;9 l/ ]0 r6 {, _" ~8 d
}
$ y+ U1 n8 d) }
* A3 K; _/ N1 n( i# Q0 | private int lowbit(int x) {1 D# ?4 a! H* s
return x & (-x);# I! S3 f( e! C& @
}5 b5 e. F: B+ Q8 L
}0 ~2 U8 q0 J% f. L
```
|, H$ e. |4 ?1 { s+ z
( f& c: `% w0 C6 i& |" b### 花期内花的数目
5 {9 ?: [' C8 E5 Y; V' Q
+ w& U% z' g' ^6 M7 s首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
* ?+ N+ \; E4 `1 K& b
$ ?& z4 H% N5 x8 G比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。4 D& Z+ H8 x4 w+ S# e( k2 ?
: o. o: ^; f& Y% d7 E, k2 ^
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
5 A& z3 ]# R+ P k
4 n) y+ c5 A, D- 给区间 `[l, r]` 加上 `d`$ l& x) W% a8 a9 l
- 求点 `x` 的值
) I# _6 ?7 {6 I5 R7 x5 B
, m% T! u& e+ C2 k$ ]2 D4 `相当于使用树状数组维护 flowers 的差分数组的前缀和。! y5 ?& J3 ~# \- b! Y0 ^6 K
7 D! P" T0 k: ~. P! ^3 O
```java
3 p+ D3 Y* y# Y6 O2 X ]class Solution {! @ r7 G1 L: [2 Y
public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
: U3 H4 L; Y$ p) s TreeSet<Integer> numSet = new TreeSet<>();
4 S$ }- o1 D, I2 v8 v; l! `7 s4 i for (int[] flower : flowers) {9 J4 l) c8 |4 ~3 `5 C; k6 d4 G8 i9 }
numSet.add(flower[0]);$ z7 i! \% C" a' O9 W# v
numSet.add(flower[1]);7 K1 S2 V7 U, t/ f: I" n' ^" k8 C
}
- \. ?! f- I$ B9 ^8 Z for (int person : persons) {4 n( b) L' A$ |! H% K
numSet.add(person);; O& \$ h# E0 y m( u& _' q
}
% x! }6 x' w) e+ w4 X5 { Map<Integer, Integer> numMap = new HashMap<>();3 {! @' O0 W! {; K* H( }
for (int num : numSet) {. L R& f1 h1 b6 d1 p$ W ~
numMap.put(num, numMap.size() + 1);0 m( h7 k! k9 r4 ^. j: `
}
6 p- x1 [ c& D* w for (int[] flower : flowers) { [, D- Y1 {9 w2 E' ~* m$ K5 e9 q! C3 h
flower[0] = numMap.get(flower[0]);
& X3 O9 g7 g4 o- F1 E. R, ? flower[1] = numMap.get(flower[1]);
6 d8 ~4 K# T( j3 N2 r2 K }
0 E2 N9 {4 H& t( h for (int i = 0; i < persons.length; i++) { S. U# C4 m! x0 G) H& X/ S
persons[i] = numMap.get(persons[i]);2 I. }. v0 \* \; O
}9 _+ X: \ s A/ q2 o
// 区间加和,单点查询- W- M% d: u0 |$ S9 R ^: ^
int[] sum = new int[numMap.size() + 5];
' i" d" j; w& n5 l1 a for (int[] flower : flowers) {1 ~! s2 a0 H3 b( }- A
add(sum, flower[0], 1);' V0 B2 L) l' B" x
add(sum, flower[1] + 1, -1);
& l" A4 `6 G' O( t- i }# a7 m% s' j5 t" Y6 {
int[] res = new int[persons.length];( o. o' L, _2 y' z# f9 q" ]9 o
for (int i = 0; i < persons.length; i++) {
* U/ Z2 {+ ?+ Y$ y' K res[i] = sum(sum, persons[i]);' ]5 n. e# B7 H2 u5 v4 h/ v
}
) \3 Y5 n: R$ o: s5 _ return res;
3 z5 b, {& [5 U# { }! p; m5 [. N# N. h
; N5 s1 \! Z" { e
private int sum(int[] sum, int x) {
2 s1 `8 P* V6 T; e int res = 0;
# q. k }( Y- n1 a0 J while (x > 0) {1 [7 v) C/ n" f( J# a$ d8 s& x; K
res += sum[x];
' B: s" @( I+ e$ `5 h3 [4 J+ p0 x x -= lowbit(x);
: b8 u4 u; F T }
% ~! }1 E: r6 g/ M6 Q: U l return res;# j0 n4 B" J8 s& t
}
1 L {# H1 P% y" f5 J1 s5 S8 B9 e- S3 }. _ A; ~# A4 P( r
private void add(int[] sum, int x, int val) {; [4 V( ^ f' _
while (x < sum.length) {
. t/ T& T/ S6 m) Z sum[x] += val;* g" }% r/ K* _
x += lowbit(x);
8 q D9 g$ Q9 e; n2 K }
: F! l$ D0 _! `: S8 t, R6 t }8 i6 x5 z! H9 V) S7 A+ G
+ X! f) G: Y; D) R
private int lowbit(int x) {
* j3 E5 v0 P/ k" B return x & (-x);
+ P- W5 Q: j: |, w; f }
% f8 T( Y U. @7 p}+ e ?/ @- A3 J; o' Q1 r
|