登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集3 l" [4 w3 R" S3 q! o$ E! Z
, _, F( n9 S; G$ X) g( g1 O* t- H
使用 Set 求交集即可。* B4 q3 Y7 T& s5 L
, g' w6 H! G: p```Java P" f$ f' ]" C$ j. @3 W
class Solution {
/ d# Z+ x! F" f; C4 l public List<Integer> intersection(int[][] nums) {
0 \# y2 m0 x' r5 ^+ D List<Integer> result = new ArrayList<>();
0 T, P5 W6 h9 _+ W- N: I; d2 W if (nums.length == 0) {! O" a. W' d# K% S' `9 C4 S
return result;
- ?9 Z+ D h" t( i% ?* f s! M% w# n }
. M1 y C( G1 x List<Integer> list = toList(nums[0]);
5 t9 g' }6 S' u: a5 M for (int i = 1; i < nums.length; i++) {
1 f2 S0 {. ?* `; [/ j/ { list = intersection(list, toList(nums[i]));
) B( R/ M' s7 o, o- f( l }+ M6 G. k/ z. ?* y
Collections.sort(list);
4 U3 Q0 r! ]% p( \ return list;+ U0 ~& ~# v1 U0 Y) x G- h
}& ^1 z" I, W% I/ q% M8 X; Y( n' z
) s+ ^2 J. ~( ~. i4 l
private List<Integer> toList(int[] nums) {
+ y* M: g! Z# W& K9 t N) ?+ e* ` List<Integer> list = new ArrayList<>();
+ w5 `* K/ [" {$ X2 f) G for (int num : nums) {# A. i' G& A- L' p
list.add(num);- n* v: N/ F! E8 ~& a
}) ?' V8 {; ?+ e Z5 d& P" n+ D: y
return list;5 K" o; N% ]; Y2 H
}1 `. f2 B* C/ R
. ~4 y/ r, R- U0 o- I9 p1 p private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {
7 V8 Z& ~3 d- i' @/ A, R List<Integer> result = new ArrayList<>();; r; ^) S; |& Y: L, J
Set<Integer> set = new HashSet<>(list1); j5 C L# n$ E
for (int n : list2) {+ w8 ?; S& N. v5 \
if (set.contains(n)) {
" X. }% f) `* T4 i: F% a result.add(n);
, M7 `' y- p3 o+ S set.remove(n);/ B* N6 Q% w8 u! i
}
6 G- y6 H9 P' f }
2 i' x; p9 ~; m; d return result;0 B. B% z* S* b+ W
}6 O0 Q( f c. w% `! P4 Y q+ x
}
\5 S- z4 [& Y) K- J```
2 \! h/ A( P* p. Z2 F5 k: h. E Y5 A$ r1 G
### 统计圆内格点数目. F% k1 U7 }( _
3 |/ e; |' N6 B, `! F+ k7 A枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。1 W! z; z* n$ {3 b; }5 {: u3 ^
& ^4 Z: a' A! {! G3 e( u4 y```Java) O- G, g* K9 c( c, f
class Solution {
) |6 B! m+ b; u7 F% Y& e public int countLatticePoints(int[][] circles) {
; i S$ h7 r7 O3 b Set<Long> points = new HashSet<>();* R& `8 o- s# h- P! r
for (int[] circle : circles) {* U J, j8 [, W, P. c/ v" D' c
int x = circle[0];
& p# H5 K/ W/ P! o0 b5 m# |* P Y int y = circle[1];
, ^+ S0 h, W9 D0 q' M int r = circle[2];$ c7 }! s+ ]4 }, w8 _/ ~
// 出于便利,直接枚举正方形区域,然后判断是否在圆内
) R9 X: @" F- h' N6 x$ | for (int i = x - r; i <= x + r; i++) {
; q4 U' M/ r6 e( j for (int j = y - r; j <= y + r; j++) {
% r: F5 B _( {2 J2 x" t if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {# B5 Z9 S4 c3 i5 Q
points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标! Y3 k: _9 ~3 v
}
% B- k5 l# F: P8 x' j }
) c8 K: M$ F6 C( ?+ w }
4 |$ u5 C, s& A8 y5 J* X }
$ Y5 M& N5 f U4 V# L! ]+ ` return points.size();
8 Z) ~( ~. m/ t ~" A6 k5 Y }: O. Y+ V0 Z* O6 o2 y" d6 ?
}, T8 _0 c) d' k* k1 I" {
```% J. _9 k1 |2 u3 l6 c7 S
, b" f4 L; P. e( ?3 i q' n) U
### 统计包含每个点的矩形数目4 i. Q: V3 A9 J ]
9 G" O% G: ^0 `) k0 K" O @与第四题类似,只不过变成了二维的。8 @) J$ m: `1 z7 h) ^ C- f
& W9 I+ a. w+ x! r- C: u; @ ]先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。
2 K1 K! ?% l9 P. I4 X, l! g% \ d M) S ?7 V) W
```Java# |7 {# C9 B! h
class Solution {
. N2 h( B2 C* f2 k z% ~( t+ I public int[] countRectangles(int[][] rectangles, int[][] points) {
* y$ @% g" l8 V2 r4 U. i/ C List<Integer> xs = new ArrayList<>();" C/ R& u3 f3 T
for (int[] point : points) {
x c% z e" M- ~5 x8 o xs.add(point[0]);
6 B- r/ h6 H! |0 F4 k/ W3 E }8 w2 h, J: c+ Q3 X
for (int[] rectangle : rectangles) {4 U3 T& Z- b9 k2 A; G7 p8 b
xs.add(rectangle[0]);
6 ]9 j) J$ Y" L) r) {3 o }/ C9 ^2 x, w6 N4 t$ r& y# U- S) ]9 o
Collections.sort(xs);2 e f; q" x J5 _5 y
xs = new ArrayList<>(new LinkedHashSet<>(xs));
+ x+ W! c; M$ W" A4 K2 e6 q6 i' o Map<Integer, Integer> map = new HashMap<>();0 W" L& R" m3 N& ] p
for (int i = 0; i < xs.size(); i++) {
8 q) G. |, S$ H- X$ k map.put(xs.get(i), i + 1);, T) b9 _- [" i/ C: r
}$ t( M6 _8 m. S
for (int[] point : points) {
0 c+ L) V7 H: |/ v$ O- S! Z0 J/ K point[0] = map.get(point[0]);
7 ~. M' u$ W6 \' m C }
5 e2 z. }/ R1 |: b! M E for (int[] rectangle : rectangles) {! V& r! I+ H7 @' u/ p: a
rectangle[0] = map.get(rectangle[0]);
: j1 j/ M) a1 H! ] }& ?. g2 ~) A. a8 T1 Y
int[][] g = new int[100005][105];
2 @1 Q$ r- S& r h for (int[] rectangle : rectangles) {
2 h7 u E7 j, ]+ q( [ add(1, 1, 1, g);7 ~& [) l& f) ?: W$ H
add(1, rectangle[1] + 1, -1, g);) \8 j) f K: t4 G& V: {0 ^- J
add(rectangle[0] + 1, 1, -1, g);2 F8 }$ t1 ], C
add(rectangle[0] + 1, rectangle[1] + 1, 1, g);
+ E1 A; E1 e g; z& c8 x% l6 m5 a }. }1 l. T( |; g* B1 ?/ ^
int[] ans = new int[points.length];( ?* R! T: w) y
for (int i = 0; i < points.length; i++) {; ~) x- n! B1 ^& E* \' ?& T
ans[i] = sum(points[i][0], points[i][1], g);) {* Q Y2 `* t5 Q' m3 \
}# m5 t d# o a+ K& L
return ans;4 Z9 u; r9 H0 `: w/ W9 j; A" P4 _' [8 D1 i
}$ _, f4 ]* F5 @8 {
D1 E- `+ U3 B" [$ c) n private void add(int x, int y, int d, int[][] g) {
) P8 G( b: Y/ F0 e2 ]* N while (x < g.length) {) l( J: i; d" p
for (int j = y; j < g[0].length; j += lowbit(j)) {
& [1 a9 k/ G' p' h0 `0 i# a5 D g[x][j] += d;! p0 p7 A3 h8 M2 _7 a# t6 P
}
( Y0 g# Z3 k8 _4 G$ @ x += lowbit(x);
+ i7 Y5 F7 a/ i6 X( e7 ]( J1 D6 u1 Z }% O! @- `4 q" M h+ r( x
}# z( ^9 A' |! Q$ h6 l
( R/ |6 U& K" V2 F
private int sum(int x, int y, int[][] g) { V* H9 ]( M2 v6 a7 X$ H I. S
int ans = 0;
; f, B# I4 `* A* ?2 O7 | while (x > 0) {* L- ~$ e2 v& @( }5 v5 ?
for (int j = y; j > 0; j -= lowbit(j)) {! Z- U6 K, `/ I+ O6 c
ans += g[x][j];
- ]0 A0 S4 C/ i: u ? }
5 R, ]6 Q: T! ~. o8 Y' M0 O x -= lowbit(x);
6 M l* C" x6 L v }: A9 l9 `# F3 r$ d+ N
return ans;4 j- L0 C+ G- R2 T$ h4 T$ q
}0 n7 x2 p6 a9 a/ X- v
4 o6 `8 }5 I2 Q! g W
private int lowbit(int x) {$ @6 l% I, ?$ x" C" z8 _; W0 \
return x & (-x);/ Q" N& B3 ~6 Q) Z; V( Q* _
}
: U( F! d) x; C% _6 `}8 a3 i, `4 G+ `; c9 F6 u% B
```/ H6 P- R( y& r& k- y1 T; }
6 x6 ~: g2 c5 d2 ^2 d### 花期内花的数目
G7 K3 V% i, K& }$ e
1 ~, @0 y; i+ }9 x6 F T首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。) Q! ~! k0 J* M( \
/ X# C$ N1 _1 S比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
& ~, c! l1 {& @: t5 m' K
; u8 O6 d8 u3 U压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
2 S0 c. T' W% e- P2 W3 o. d
8 `$ ]1 F& o, j% h6 t# H& ~( a- 给区间 `[l, r]` 加上 `d`
( g+ h1 |2 g6 I7 p" V% E- 求点 `x` 的值( O( P H0 ^; u
: P" g4 g0 M$ {: I& a相当于使用树状数组维护 flowers 的差分数组的前缀和。
/ C$ ]1 i1 U/ F" ]# t3 B" c. d' T' y0 p6 d
```java2 r, U6 \7 |6 Q, p7 x. }7 U3 J* }
class Solution {
: n) N4 l6 |9 O& K. ?6 e public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
: x$ ?7 M- N" M) M: L+ H TreeSet<Integer> numSet = new TreeSet<>();
, v& @, x: v% [# N: ?/ r for (int[] flower : flowers) {
* x0 y: _* P$ Q/ O numSet.add(flower[0]);
% E7 W+ T5 C4 F+ x0 J% ^ numSet.add(flower[1]);$ B, G# S- ~ I, E; r! e7 I0 X* L
}8 R' W; C; ~5 }& T+ Z j+ S
for (int person : persons) {* k! H/ Z; y A H8 o
numSet.add(person);
: r# B4 Q: i9 s% z, J' B }$ g2 g* a; d Y2 R) [6 I* |
Map<Integer, Integer> numMap = new HashMap<>();7 m( ?% Q. k: }+ F) r/ V
for (int num : numSet) {; ]7 l0 t; H, P0 K
numMap.put(num, numMap.size() + 1);
* [; l1 T M: v+ L3 J }
" J4 J0 u. ~# [7 n; G for (int[] flower : flowers) {! x) x5 Z, N6 ^, x
flower[0] = numMap.get(flower[0]);
, Z% C( X q! b7 O2 B flower[1] = numMap.get(flower[1]);
$ Y4 A! h/ Z2 p/ r8 Q8 R- h }
8 M7 \2 ]3 m1 f* J; e0 C& h for (int i = 0; i < persons.length; i++) {% v: k1 g4 n+ @2 B& ]: s
persons[i] = numMap.get(persons[i]);
9 d( o8 n4 F& ?/ z% d' x }( |+ x% ~& A- E9 l& }
// 区间加和,单点查询6 i2 f) g( A6 L
int[] sum = new int[numMap.size() + 5];% C9 l3 x$ n! C
for (int[] flower : flowers) {
7 I0 L' K5 c# g add(sum, flower[0], 1);
/ e* |/ `5 v7 k: v# j2 N! d" S add(sum, flower[1] + 1, -1);
6 l% J" o1 ^7 g } b0 J7 J4 W3 K7 x; ?3 ?
int[] res = new int[persons.length];5 ?* O' W( E1 O2 w% \- G. L
for (int i = 0; i < persons.length; i++) {# m! P8 l+ @! s8 r" f' b \
res[i] = sum(sum, persons[i]);
1 F; H* L) }7 \2 W; n }
( K& `& F( U0 ~1 V, q1 Q1 U return res;" f5 c% u# j8 a- j
}' U$ q6 Q0 e: B
4 F$ O. P" C6 m6 \" k
private int sum(int[] sum, int x) {5 z! n: o3 a+ \; h. V
int res = 0;* z0 u! z" t* f, S9 k2 A& w4 \# Z
while (x > 0) {
4 X) |7 G: {! M! w6 [& b- m res += sum[x];
. z! y5 k; S1 @4 @ x -= lowbit(x);
# m% G+ z; p+ g0 c }3 e% F# p+ S: A0 {& U2 [ V
return res;+ X/ F. G3 P9 @( G1 \' g; M( C; s
}: A+ [$ }7 U' n3 ]& b
# W5 B. K& H' e8 \+ p private void add(int[] sum, int x, int val) {3 {, F* M/ y, n5 H$ ~# X4 ~4 i
while (x < sum.length) {& h9 M, v9 `& }* r6 e. c8 s
sum[x] += val;- C ^! y6 G1 |5 l }+ q: A' s
x += lowbit(x);
+ g/ @- E8 Y; u' y% W+ V' P+ M }
( ~! w9 X' [0 g2 {3 ~% u9 a$ P8 W }, j3 i1 p' H9 e: E/ i
) |: C! v8 V5 Z% x3 V; U( H4 S* ~
private int lowbit(int x) {
6 K6 Z3 ~6 O9 a) f% a; T: ~ return x & (-x);- B2 V2 `/ L2 Z. o! q6 b* }
}+ x( Y1 R8 K' N) G/ g& V
}
) T) g3 f9 ]0 E; z |