登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
### 多个数组求交集
, t' B) T4 {2 i( H# t! ~
7 f- D5 ~2 ]: K9 l7 [5 I5 C. p使用 Set 求交集即可。
- u1 H- r- b7 P4 | E- Q
+ t9 D, b3 o% G```Java
0 o% t9 |) c$ w6 V; Jclass Solution {
4 Q9 j) Z- ~5 ^9 K2 c) ~. y$ M$ A public List<Integer> intersection(int[][] nums) {
3 E" v$ P) f% U* o1 d4 J List<Integer> result = new ArrayList<>();
& z- q H0 |' _/ v4 I1 N if (nums.length == 0) {( I7 E6 K1 a: k0 @
return result;
' i& [) ?5 F! K. w }3 W6 ?# e( ]; l) W
List<Integer> list = toList(nums[0]);, X: n" A. K3 M: a( E1 f0 o3 A b
for (int i = 1; i < nums.length; i++) {, D; O/ t8 \. e$ g. {) y1 j- o
list = intersection(list, toList(nums[i]));: [ [0 U% F0 C
}7 C' Q5 B/ @2 j& S1 D; T! l
Collections.sort(list);
$ b7 [5 J( G5 s5 w return list;
6 g7 g4 p9 A/ u& Y/ J }
: v" k0 P' d) L! L, Z7 U
9 }1 H: }: \# ?- ]' U private List<Integer> toList(int[] nums) {
" F$ W+ L/ g# y( h7 |" Z& e List<Integer> list = new ArrayList<>();
1 K# M; ~) s f i8 s for (int num : nums) {
7 ]7 |0 M5 {! j. m0 L( D list.add(num);
! M) O8 P' x9 |2 c! f7 L) C- P7 o }" l) @8 C* L6 g
return list;
9 s9 j- F$ m! u) G0 T }
8 ?3 a. T" S; o4 e& }& @( ^7 D1 Z
private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {, N! k- L5 r# I3 Z( v& K# Y+ G) a
List<Integer> result = new ArrayList<>();5 H! {5 P- Z* t% D+ P' h
Set<Integer> set = new HashSet<>(list1);
! Y; @9 J) i' T+ y M for (int n : list2) { O& @3 e) V3 b2 I* Q& j0 V
if (set.contains(n)) {) b/ E1 T# `! C+ X/ D9 J
result.add(n); r9 k; u' b% o* j9 _" Q& v- | h
set.remove(n);; r0 \& [- Z" d2 i
}2 R+ ?. V6 P: O4 \2 i
}3 v/ c8 b+ j) y7 U- D8 ~! M
return result;
- O6 ~) a/ c; ^' T: S }
. b- s' d1 @" {6 N0 @}
7 Q' Y& ?8 c, T```: W& j+ ?( J4 j: e1 a: y5 q
/ r; x; w t; l1 G9 M* s) v8 H: ~" K
### 统计圆内格点数目4 t c9 s! w9 ]
7 O4 b6 q) ^, I, N7 j) I
枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。
; o$ g& ^" Q9 G9 `7 n
6 ?4 Z/ z5 \" v6 }& b; d8 n' C4 U```Java
1 U( [6 m6 @6 M/ X1 @class Solution {
! [) U" R& M( A: t' z) N public int countLatticePoints(int[][] circles) {% c8 u& d; T% f2 X
Set<Long> points = new HashSet<>();
: w5 Z, m+ L3 n- J for (int[] circle : circles) {8 z5 i, ], x9 J4 \ k9 d
int x = circle[0];+ ], n4 b2 H. Q/ E- i2 Z3 V8 r, c% y/ Q
int y = circle[1];
1 p0 M# R! W$ F5 \" z int r = circle[2];
+ `, x/ F2 F# w! o. l // 出于便利,直接枚举正方形区域,然后判断是否在圆内) A) i5 A- L$ g w! m
for (int i = x - r; i <= x + r; i++) {
+ W9 Z( b6 g# g% Z9 @7 \ for (int j = y - r; j <= y + r; j++) {4 I) R/ b3 p$ O4 ~$ b) r- w- ?
if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {: T& w8 ]3 {/ G
points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标
& X e; W, i" O/ K }( |) l" W4 t8 _. T2 B: ]; Y
}# _5 _% O7 R! m
}
4 Y2 F* y- T3 O2 v" z }3 R% V2 r% \% f) R! v6 z
return points.size();" ]9 o/ m" i1 H/ |" d
}
; p0 R& h( }6 N4 Z8 t& R}& _$ a0 s2 T( ]9 `
```
2 A+ l8 D. k# Q% \# G* o2 `5 }+ G, f2 G" }' d. D
### 统计包含每个点的矩形数目3 s. D# k( z. i2 [; ~" @0 a
4 }9 n& N" v4 ]! G$ l4 G与第四题类似,只不过变成了二维的。! q5 u( P/ w* W0 k! F
4 O2 }1 b8 G$ S' h3 _: c
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。' ?1 `1 o* R8 a7 Y# [& T
4 N1 k4 e9 Z; d( t```Java
- E2 c, T$ N2 W8 Y3 C# X5 ?& H* u9 Vclass Solution {, z6 y2 N2 q5 Q/ R" r4 t
public int[] countRectangles(int[][] rectangles, int[][] points) {
( d X; P t: p( X k7 c$ B List<Integer> xs = new ArrayList<>();' `! l; p! V- V! f4 T& X
for (int[] point : points) {7 _, [7 f4 y1 B. j! A% m
xs.add(point[0]);
& m( [% j' N7 ~* k9 L$ F* J }' T1 s, k1 D- z7 f/ ]! e# f! A, ?
for (int[] rectangle : rectangles) {: Y7 g7 `) C! o' j& g9 ]( Z
xs.add(rectangle[0]);/ A$ B' D6 C# w7 a
}0 y9 M7 G1 h* {0 j% N
Collections.sort(xs);$ Z5 y2 u$ s$ O7 L$ Y8 [
xs = new ArrayList<>(new LinkedHashSet<>(xs));
' k# q8 m( E; c2 h Map<Integer, Integer> map = new HashMap<>();; f+ s1 u- N2 D, h% ]
for (int i = 0; i < xs.size(); i++) {
6 r, D9 {$ x$ s! V# I map.put(xs.get(i), i + 1);! F) M" v/ |1 f1 s5 j$ i
}* T% `1 Q$ f8 m5 d: p- ?; o
for (int[] point : points) {4 L; x3 B5 |* A+ P" K/ Z" @
point[0] = map.get(point[0]);
: s4 |/ m( L0 U6 P$ F+ g/ A }, P9 n, n0 t7 v. y
for (int[] rectangle : rectangles) {
: E6 C7 q" u, D, T8 o) h7 Q rectangle[0] = map.get(rectangle[0]);, a/ r2 ^! Y5 Q" g+ q) e
}, O2 F; D' N' m( f) B
int[][] g = new int[100005][105];
, r- V# d: A# V; i! ? for (int[] rectangle : rectangles) {1 b, N f- R1 \7 T* x Y) |
add(1, 1, 1, g);% p5 \5 E' N1 I/ R7 s4 N! f9 C
add(1, rectangle[1] + 1, -1, g);
5 O. W5 j, n& l add(rectangle[0] + 1, 1, -1, g);
' z# t" ~) A* k" ?6 F2 v+ s1 g add(rectangle[0] + 1, rectangle[1] + 1, 1, g);
+ V8 o- b- J' P# | }
- n! z0 K1 U; ^- ~ int[] ans = new int[points.length];
9 R# a7 `8 j( |) L5 ` for (int i = 0; i < points.length; i++) {
. h' o8 ^2 k& U' A z ans[i] = sum(points[i][0], points[i][1], g);, t& t; X! ^ E) s: U) D' N/ V4 i
}. r8 ~# v$ T! N: o
return ans;+ l7 f/ m; X0 G" s" I
}
4 x9 B/ v; [0 }$ L2 @* O% e# Q- B# Y) W6 J( E& t8 u& F7 d
private void add(int x, int y, int d, int[][] g) {
7 y$ a h4 m+ A8 r1 q* V6 r while (x < g.length) {- {2 c1 ~6 l# ^2 |/ `2 s
for (int j = y; j < g[0].length; j += lowbit(j)) {* c t; X# y! H" D2 ?
g[x][j] += d;
+ R x ^2 q5 j }
) M" f* K& y) Y3 v x += lowbit(x);
9 r( S9 s& w1 Q" O/ ~9 \5 o _/ R) U: { }& {4 |8 S8 r/ b, o9 ^& Q! x
}
1 Z# A' w8 h, T7 t9 m7 b" G+ W! Y% x% n3 N" w+ o5 B$ X& _
private int sum(int x, int y, int[][] g) {# C. v8 _: h5 y
int ans = 0;1 ~' H1 N9 S# u* C% k
while (x > 0) {
' O( n6 O. s9 p) m$ | Z9 d; H2 x for (int j = y; j > 0; j -= lowbit(j)) {9 Q% N9 x9 V; I/ f `0 ?# r
ans += g[x][j];
; ^" a" v* a9 c# s7 A ]1 U" v }
; [/ ^% a' a+ @! M( [ m' p x -= lowbit(x);
& g" a# p1 O* T B; L }3 c/ G. X [: X6 Q. Q* E
return ans;
7 C. ]5 R, [1 g; ^4 A: f1 X }3 K- _9 v/ w/ Y) n4 Y+ y2 f
2 X$ h7 p) a. E3 s5 N/ Q" F4 L
private int lowbit(int x) {
* [( r4 i! n5 r N B return x & (-x);" C9 e$ C8 y' m6 Y5 ?
}) a/ c5 a W" o9 A m
}# j d/ A5 c5 h. c! x- q8 e
```
9 m- S/ r# }% }' g0 j# y H" K- }8 S9 `0 J0 H/ k4 c/ \
### 花期内花的数目
" a& k/ t- d* W' g* q2 d, c# r! |/ K1 @5 o8 k9 e8 T$ n% Z0 I
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
9 z. j! p# ^: \2 B: F. U, p) n* S; Z! r7 h r$ t; y
比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
1 M. S* T, X! o8 B7 k3 ~+ x# k1 B; R
/ w4 E! W- Q& l+ r/ q ^2 j+ V# W压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:- J2 l4 d) _: d8 Q/ T6 W0 Z: W
! {% M, t) L8 T6 ?6 l- 给区间 `[l, r]` 加上 `d`
$ V: H1 R7 {- `4 _- 求点 `x` 的值
! j- ?% _/ R. d7 t1 R2 H
0 F8 ^ i* h8 S1 H, h/ p! N相当于使用树状数组维护 flowers 的差分数组的前缀和。
$ i i/ _& l* N1 L7 ?* S0 D& K3 P! J
$ p/ w) {' z, v7 h; y4 J# w% m```java' r' U r/ P' T0 [. P
class Solution {5 k7 D7 r$ S G( o- O
public int[] fullBloomFlowers(int[][] flowers, int[] persons) {' B# k, C" h2 \4 h+ I' ]
TreeSet<Integer> numSet = new TreeSet<>();, `1 b, P' ?; ^: k1 Z
for (int[] flower : flowers) {
1 a- u7 g+ {8 \ K0 u numSet.add(flower[0]);
3 X! e2 W; E# l1 ^0 z numSet.add(flower[1]);" W( x8 @, `: v$ A! J
}
4 S( Z9 A* h: s# A5 `1 _ for (int person : persons) {
; J( k; v! h1 y: i numSet.add(person);
# ~- l$ s! M" Q# N }2 p+ w' \0 a5 ~. X8 d" Q- A$ n
Map<Integer, Integer> numMap = new HashMap<>();' |: @) e; W& F3 D# \+ j
for (int num : numSet) {
2 h/ Y' N, b b: m; d* g numMap.put(num, numMap.size() + 1);
. ~# Z+ y# L* b* @ }, B) H3 ]/ X4 X" @/ V
for (int[] flower : flowers) {
; S% R5 D4 w, V2 o) b, G6 H, F4 ? flower[0] = numMap.get(flower[0]);. R: |8 ?! q5 ]. P4 A$ c4 K6 p
flower[1] = numMap.get(flower[1]);3 f6 s; i! N/ N: x. e
}
6 v7 W3 O7 g/ t( C4 y for (int i = 0; i < persons.length; i++) {
/ Y2 S5 ?1 K" h1 H% @ i persons[i] = numMap.get(persons[i]);
# j- \# A" |9 d }4 y* I* j% p ~4 I% V& O
// 区间加和,单点查询
0 V6 H+ m" u C" K; ~" J int[] sum = new int[numMap.size() + 5];
" q" [* l' ?8 f; q0 [ for (int[] flower : flowers) {2 `+ `1 p3 D6 h9 H z3 ^' p
add(sum, flower[0], 1);/ h) N! [; \0 D9 }
add(sum, flower[1] + 1, -1);
; ?7 q+ k8 r9 Q1 _. f3 t }0 B$ l; P; Z) ]
int[] res = new int[persons.length];. v+ B0 ?; [6 V1 ^" ]
for (int i = 0; i < persons.length; i++) {9 B$ l2 G6 c, }3 x/ b1 ]0 X' H
res[i] = sum(sum, persons[i]);5 H, z+ X3 O$ |. T
}. T0 a, ^- j& H& S
return res;( C) q) ^2 y) `6 J1 w6 v, f
}
5 B5 h6 }# J, W& e
5 \8 ^- i! N! n! ]2 ~% O private int sum(int[] sum, int x) {
) e* j- a, _+ j! [5 k int res = 0;
# Y* M7 M, b* E( X+ R8 h$ L* o4 g while (x > 0) {
4 O' r4 b* q" L; I0 j1 | res += sum[x];
& F* R z! k7 C; T/ ^1 w! H) i5 d3 q x -= lowbit(x);7 \: C7 ]8 A; F f
}
1 N1 ^2 H+ b2 t5 t2 m5 a return res;
o+ V t5 ^, ^& L) `7 A( e }$ S g, c" i/ N1 R' ?, V
. B' m! |' g' F& T4 n; H7 L9 V9 f
private void add(int[] sum, int x, int val) {
{! S1 z: R4 Q$ x+ ^ while (x < sum.length) {7 E1 h" q7 @* q$ }# t
sum[x] += val;
. Q2 b. @9 N0 k7 I, E! g x += lowbit(x);
" K' w: H* p. J0 @- \ }* S5 m( d/ c3 v+ c5 P4 e
}; i3 R2 k# p7 s7 q9 ]) g
) K+ t8 [ l5 h7 J& f
private int lowbit(int x) {
0 ]" F3 I5 M& i4 h) }4 f( |! ~ return x & (-x);
+ Y/ p) O0 O7 `- N }
# x* d" Z' R8 K, j+ \2 t}
6 c: \: m/ M/ S, Q6 B8 {( ~ |