登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集
/ e& a( u/ j- N% S& N- d6 @5 R; t' C3 Q+ {9 g* X
使用 Set 求交集即可。
6 [" i+ o |$ Q7 U: v) p
0 `9 t8 X, J' \, a" }```Java
9 J: F8 H) v& ^& ~+ H" rclass Solution {% ~, E7 x% Y) \# V, o/ a A; j
public List<Integer> intersection(int[][] nums) {; m. G7 C( q B5 a
List<Integer> result = new ArrayList<>();
6 f0 F6 S1 g9 c5 Y9 t9 |# K if (nums.length == 0) {! K1 B, j4 ^- W! g
return result;
# N' C u' F% k7 G }- N1 W- X5 v, I
List<Integer> list = toList(nums[0]);
5 L1 x2 e3 g) K/ X for (int i = 1; i < nums.length; i++) {
" ~0 V, `0 i% u9 J! w9 z2 M" Q8 o# I1 D6 | list = intersection(list, toList(nums[i]));1 ]8 n% J( z* f( r) r, n( L1 N
}/ j9 U1 B/ f) d6 ^3 V0 N9 s
Collections.sort(list);
! F7 H, f4 q- ^4 u; P( j return list;
7 T7 O, e5 R3 q. Y4 D# `) e+ A }
m' O" D5 M+ D9 }* t [* j- K
% _, |, y- A1 D8 Y private List<Integer> toList(int[] nums) {
7 P' p$ {* O! z) Y2 W& R List<Integer> list = new ArrayList<>();- _) V. v" Q4 y. x( }9 Z
for (int num : nums) {
( L, |# v0 {; g7 y F$ Z& Y v list.add(num);* `. X1 R7 l, H# r) S
}
f! s f% _" E( a9 i$ n) j return list;
4 w! Z5 U# m% X3 f3 ~0 P% p2 s0 q }
/ J: ?4 \& x. A% K4 q$ ^# W7 y( i
private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {
p% Z3 B1 _. n% [' }! n; K List<Integer> result = new ArrayList<>();2 T8 f. o8 z1 p3 T6 M9 @* j& b
Set<Integer> set = new HashSet<>(list1);) Y/ L2 d+ x9 T" E
for (int n : list2) {
8 x0 ]% @7 N) }. x; m if (set.contains(n)) {
. i( T+ f! y, _ result.add(n);+ S! g, z# R3 Z7 K9 r
set.remove(n);/ P3 Z. N% w+ z& [! d( p6 r
}
" `# u l+ N! B+ |3 \ }$ V+ j! r# C# s, A
return result;
5 i `& n' `8 A, o" G# S) c* a }
+ R1 J) b/ P- C+ m; ]2 B q}. X$ |2 o* O, W; v7 u4 o& K6 C
```
# w$ \( v3 u+ w4 o/ O. j! t) r9 V* D- O q
### 统计圆内格点数目
; \6 w; }. E F$ |" y% F( C# q% c* Z" Z) ~- A
枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。
$ x5 s7 G8 {( S/ j$ j6 ^# o. Q p. i" |5 @3 H2 j* V7 L" H- d. N
```Java
( H$ k$ D2 Q: I6 W! P% w9 X# U9 wclass Solution {
# [! z- @1 f( E1 x0 A: H public int countLatticePoints(int[][] circles) {0 `; z' w* `* ]5 y9 X, K
Set<Long> points = new HashSet<>();4 e( [5 V) J( m/ |
for (int[] circle : circles) {
, M$ n, f- y/ p0 a# w int x = circle[0];$ L v( e P, F
int y = circle[1];
# D: A* i; y" z2 L! Y int r = circle[2];/ k/ i# T+ `* m2 [5 @) ^
// 出于便利,直接枚举正方形区域,然后判断是否在圆内" C8 V$ X$ R1 J; _: E) R
for (int i = x - r; i <= x + r; i++) {
2 U9 o7 @# c" |5 T9 A- F for (int j = y - r; j <= y + r; j++) {# p4 c3 A$ J+ E# s7 {# ^
if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {! F, y! v, V# t2 k3 b, ?
points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标
; p7 A0 q0 `7 D, G: S }+ K% `& h+ k9 a
}: U, U: k% z1 p, c5 `1 U2 k4 V
}; f; t' m$ M! \6 ~3 c
}3 Q7 a9 A+ o" i1 D. x/ @8 ]: ~
return points.size();
+ B X- C5 E2 i+ Q* W( d o% Y- H' @1 a }8 O+ r5 ~8 b, Y6 Z: A3 p' s4 Y
}
2 B2 e+ R# @2 J' @```1 y6 T1 ^) }, S! I4 B2 U) d
i& O* m0 }% u6 H: Q( q" p+ z/ ]
### 统计包含每个点的矩形数目
" P" v& |6 g8 m T% s6 z1 U! O5 {6 K0 W
与第四题类似,只不过变成了二维的。& `/ [& \+ p$ w; ?
+ B# u% k! N2 Y9 E6 W先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。
( ]* }+ \6 S: c% i7 t; e: R. d6 T- N& I- B+ e: d6 Y' |
```Java. r: E. f3 ^6 l0 j6 t$ ?
class Solution {
" ]% e0 c s: D( j public int[] countRectangles(int[][] rectangles, int[][] points) {
# q# G2 c! W8 _. S& d! @. a List<Integer> xs = new ArrayList<>();" b8 J$ h% w, {
for (int[] point : points) {; g) `2 ]: i% G
xs.add(point[0]);! h: c. ]" A7 [) \
}& G) ]8 P# X* i: D3 a5 `
for (int[] rectangle : rectangles) {
1 k' a" j" R# y) M. M xs.add(rectangle[0]);* N: N3 h$ i) O# a4 p! k8 j4 g8 I
}' g' q8 ^2 n4 ^) c, X3 e3 ^
Collections.sort(xs);
2 _9 a: ~0 t/ G4 R( |# y2 f xs = new ArrayList<>(new LinkedHashSet<>(xs));
6 R6 u D# Y2 {% y1 i5 J Map<Integer, Integer> map = new HashMap<>();# \* }3 T( x: V% [1 O) b; h& K4 P
for (int i = 0; i < xs.size(); i++) {
# A2 M9 o- J! V# H map.put(xs.get(i), i + 1);% e: B0 t( _* t
}! |2 q% ^: \/ f2 e+ T6 r
for (int[] point : points) {
( F7 j3 o1 ?. ~7 N: q; k+ S* M point[0] = map.get(point[0]);
% k7 _( p1 U2 P7 O' K1 W }
% t! ~( B" ?8 }' S" B0 | for (int[] rectangle : rectangles) {
, q) `1 [% j* W' T" l3 C( K rectangle[0] = map.get(rectangle[0]);
% x0 [& `. r- q( P' n$ f' Q }
3 h4 s, b* Z7 x0 | int[][] g = new int[100005][105];" b+ I; j' C$ ?9 P4 n# {
for (int[] rectangle : rectangles) {; T; z) i5 S$ b
add(1, 1, 1, g);* V2 l# P' f0 c; v+ K1 A* ~
add(1, rectangle[1] + 1, -1, g);" w* C* X! }) I" y3 J$ b7 }+ @
add(rectangle[0] + 1, 1, -1, g);: U- f& c- ?1 O$ k+ O
add(rectangle[0] + 1, rectangle[1] + 1, 1, g);
2 l+ t8 c7 ]( Z6 h6 _ }4 [' L. d/ d. e0 ~6 u3 `6 U. I
int[] ans = new int[points.length];% b: Z7 D6 C! k3 f: l+ w" v
for (int i = 0; i < points.length; i++) {
+ u, \( x/ ^! ^0 `: {7 e1 I' v ans[i] = sum(points[i][0], points[i][1], g);. F2 t; J5 b# e' C
}# q3 G3 E( C' T) P) D9 z
return ans;6 ?1 I) B8 g. U+ S3 M
}6 e L, q7 Y/ k0 [
8 K8 b* k2 I. v2 [# f' h private void add(int x, int y, int d, int[][] g) {
! c Q0 c' p) i! D3 Q4 M while (x < g.length) {% e- L+ A- ~# i* u
for (int j = y; j < g[0].length; j += lowbit(j)) { m- S v% m1 \$ p. z1 p
g[x][j] += d;
! n' n9 J1 r$ F7 M$ Y }, E& L* c" I1 ] P6 y- C+ u- {
x += lowbit(x);
0 n7 O/ x t8 u( S% [, |0 x }
& T. O- q3 m, w3 q% E$ z) A$ X4 T }
- U4 V9 c0 m1 v7 N) J$ j
! T$ f: I3 [1 z( e8 z* f% h$ S private int sum(int x, int y, int[][] g) {
2 t7 \& O7 T5 a int ans = 0;
/ O4 o7 ?! @% w% N3 w' u/ P& r9 _ while (x > 0) {% D9 U# O( H5 W
for (int j = y; j > 0; j -= lowbit(j)) {: m) e# K* A2 c- Q6 u8 k
ans += g[x][j];9 S* J1 V0 r5 }- ]
}
; m2 u* h" T# E2 e9 Q! h x -= lowbit(x);7 \6 u& t' h2 B& J& t
}
& v; t2 g, W6 l- o0 Y return ans;
1 J, f/ ^9 ^0 h) [6 S* A }
* `5 n/ X8 S1 ]
$ O" g0 F) C9 @6 o3 D% G+ C9 s6 } private int lowbit(int x) {
G% h2 y, P' M6 O, G# @4 |: g1 v! d+ l return x & (-x);
8 J% ?6 I8 Y! ^# q }- M* O! ?+ b0 ^ n
}
/ w8 {, w- Z7 }; G* h```
$ t( j: M/ V/ I' v& i8 Y3 U: G6 F( n0 M2 X& S9 {8 [% k
### 花期内花的数目' X! }! H- M0 X* c3 Y
5 a% z. `* K) q' q8 V- j& F
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
! x+ a( Y/ \3 g8 I
% J, P' w. a1 V. H4 U, f比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
6 E+ ^+ F# ]. v2 q# d% O) ]2 P7 t) ^) N0 H/ ~# D+ U0 U. L
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
% F( y, i; Q9 p3 Y3 d8 E. g+ s6 U4 N5 R# |7 Y/ m/ S! I
- 给区间 `[l, r]` 加上 `d`
h+ m+ c8 p$ e, @& i- 求点 `x` 的值# n+ b0 K# g3 B3 \. G
2 q8 e" d7 D% K4 s
相当于使用树状数组维护 flowers 的差分数组的前缀和。
9 `# k: a3 l( H0 V
f% f0 v9 l$ Y$ f& L0 J! E$ h```java
% ]$ E9 [( s( h. z; Q' sclass Solution {
7 x& z/ _% @6 Q. U5 S9 T$ Q5 Q public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
0 `. G% ]2 s& y4 M& T8 f$ _% \) T4 h! k TreeSet<Integer> numSet = new TreeSet<>();
- e( K% @( g! I0 _& L# w+ M for (int[] flower : flowers) {
9 p" A1 W- @4 b: D0 Z numSet.add(flower[0]);+ j0 V; \. T8 z8 M; A
numSet.add(flower[1]);% N) P# G u$ j3 [' Y
}
0 z/ g- @' G; U# s1 H9 x for (int person : persons) {
" O$ W1 E* ?- A! p6 Y. y numSet.add(person);. o4 u _6 o1 l2 O/ [8 j5 P' p1 r
}
+ u+ k u5 c/ V( l0 p; {4 _- ` Map<Integer, Integer> numMap = new HashMap<>();
) a4 y/ v9 d. c' Q for (int num : numSet) {6 c7 X/ a; J: D: @: u! T; V
numMap.put(num, numMap.size() + 1);& C3 {) G2 }. g _* ^5 S* ]: o: d. W
}
7 Q, b) O9 F0 `9 ^/ X5 t: h for (int[] flower : flowers) {
5 M4 _+ ^1 }* F flower[0] = numMap.get(flower[0]);
2 I! W1 ~& W. F8 k, J flower[1] = numMap.get(flower[1]);
2 f* g! w4 f/ e, z }! u% Q' w4 w$ t! g x& z+ e* I
for (int i = 0; i < persons.length; i++) {
. _7 A9 y+ K5 u9 @, F persons[i] = numMap.get(persons[i]);
; \" _# h) O0 t. n1 _" m+ F0 d }& J; Y0 V4 ~# v
// 区间加和,单点查询9 |3 D) d$ M' m% s C4 y0 b
int[] sum = new int[numMap.size() + 5];
Y/ q( i6 ]" e9 o. {; h6 n for (int[] flower : flowers) {& E" {! b. w& B! b4 ~+ n
add(sum, flower[0], 1);4 D( F* ~ m0 n& G
add(sum, flower[1] + 1, -1);. ~* }5 E( a- A8 @# w% d
}
+ f! [+ V2 ~& F5 ?/ ^% v+ L int[] res = new int[persons.length];
+ K: V( Q! s* }) x9 v0 @ for (int i = 0; i < persons.length; i++) {
5 O/ H p. ]8 K2 G0 x. X$ B res[i] = sum(sum, persons[i]);
/ \5 J; A4 h" @- y }
% {- w3 c, b1 z$ t; n. U return res;1 E+ W- P* m# N3 O" V6 f1 B5 P/ N
}7 K& ~5 S" S; C3 n$ T
0 w8 @3 r0 o% h) W' m9 D+ X7 J private int sum(int[] sum, int x) {* N1 K. K7 M7 o f3 Z9 E
int res = 0;$ _2 I( C; |" U
while (x > 0) {+ r! v' J# O0 D
res += sum[x];
; p' K# X7 k$ J5 f+ A* `7 _( k x -= lowbit(x);! F- t5 @! E4 F! Y4 T' D& f
}) K$ ], h$ Q% Q2 `8 B9 b6 f
return res;
. C9 w6 Q7 I3 f& S- N }! S, L4 Q' @7 [3 H. g- M: f' r
1 e) K7 a: i/ v/ c5 f private void add(int[] sum, int x, int val) {% h. k% G( s; l( @+ L1 a2 j
while (x < sum.length) {) W9 r1 V: `, q8 d! ?
sum[x] += val;
* Y* g$ {: \" O, Z& F' J x += lowbit(x);4 W7 n6 Q3 y4 S6 h& V ]6 v* b
}
7 E: H$ m' J0 T- N. \' K7 L5 n }. {8 j3 H- A& w0 C4 J. |% H
: ~0 g, v8 e9 q1 n/ L; u! B private int lowbit(int x) {5 ?1 J' C( I; _, A) q/ k
return x & (-x);
5 ?, Y6 V4 ]* q; x }
9 g" p2 U% ~. H& [8 g5 J2 k}. \% z9 A0 B5 p( N; G
|