找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法 | LeetCode Weekly Contest 第 290 场周赛解题报告

上岸算法 回复:0 | 查看:2462 | 发表于 2022-4-23 23:29:54 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

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
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表