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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
### 多个数组求交集. K% _) t8 b+ F' n+ i+ g8 S
' i( ?8 }& ^9 y9 q& H( ]+ z
使用 Set 求交集即可。: S7 |. c1 b, K

+ E/ S# f, l2 E/ G( }```Java
* J+ w. F# K: b& ]2 N: nclass Solution {
; ?9 V9 A; D  V- o2 A4 J/ r    public List<Integer> intersection(int[][] nums) {; h2 {5 W0 O7 w7 v, s/ z" _6 j
        List<Integer> result = new ArrayList<>();9 ?) k+ h/ [! v( q; B
        if (nums.length == 0) {) Q2 j5 j/ Y* A4 Q3 `! k5 x$ f
            return result;
/ W/ ~- V8 S* E9 e7 y6 L8 @        }  N0 c4 s$ ^* p4 H* x( c7 d: a' }- Y
        List<Integer> list = toList(nums[0]);
- F* e$ ?! H% J- ~1 o        for (int i = 1; i < nums.length; i++) {2 a" N0 F2 ^  \2 D# x& f  E
            list = intersection(list, toList(nums[i]));
6 e. l, a( w& C' u9 s        }: B- y5 m  d# o& T, q7 ?- T( {
        Collections.sort(list);
9 _! x' ^* \6 D        return list;% V& s& ?% F2 C4 Z  n5 S. ~
    }
2 R. T! T9 ]/ n/ ~" @8 f. I
! U6 q* {% U' m' Y7 s6 ^' r& ?    private List<Integer> toList(int[] nums) {( V' k  Q7 N+ p0 D. N& h% R* F5 b2 G/ F
        List<Integer> list = new ArrayList<>();3 p& D! u. \2 f! G* \
        for (int num : nums) {  b/ s  z$ R# c5 _( m
            list.add(num);
9 ?9 Q% T; l, q' ?/ {# W6 m        }, o; ~3 p1 k8 P; s) Y) Z
        return list;
) I* t, m3 H1 W( \    }
% m6 U( c  a& z7 ~) Y" p( [& ^  w* m- b( c5 N: k
    private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {
3 S, E+ z5 a4 y/ y, Y7 x4 D        List<Integer> result = new ArrayList<>();
' C  [( [, e% A  m        Set<Integer> set = new HashSet<>(list1);% _' m) d( @* i4 k. Y2 M" }
        for (int n : list2) {
5 o5 L# g- Q+ {" \% ]4 ?  a  Q( Y            if (set.contains(n)) {
  o( d7 V5 S9 Y) B                result.add(n);% B+ m+ ~0 m& w5 {: [* T1 Y: c$ G, H
                set.remove(n);
% q9 L, x' {% z5 L            }
% h/ R; u6 j* P  i! e' T        }. m$ U1 w5 J7 S- d) T+ m  O5 K
        return result;+ P: S0 p& |* B
    }
: f4 g/ f: r! i0 ^) u  b" c}
8 u% D, j6 E/ G6 s+ O+ X```) s/ ~; N8 _1 m" p; e' l
4 ?; w0 A. Q% H: i
### 统计圆内格点数目
4 |9 A1 m" K- a2 ~1 K
! q- @8 m. J3 K2 }) B- P枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。  M1 `/ y! _7 _) z6 d' c

! y1 \' e) j- o2 h0 N( D```Java6 H# F# H: L3 t0 C2 G
class Solution {6 Z/ Q0 z* d& i
    public int countLatticePoints(int[][] circles) {
7 M: X( s/ S9 d0 d4 V        Set<Long> points = new HashSet<>();
! l+ N6 E& [8 e5 Q* o% ?        for (int[] circle : circles) {- x0 d! O" {) y( i) C
            int x = circle[0];
) N( S7 L9 [, U2 Z7 K9 _1 q2 m            int y = circle[1];
* X; s; j- a0 L! x6 I& |            int r = circle[2];' j+ O6 w; g" W$ w3 D
            // 出于便利,直接枚举正方形区域,然后判断是否在圆内
" @0 r0 B+ A* V) w* v/ G            for (int i = x - r; i <= x + r; i++) {/ c3 @, s* n$ F
                for (int j = y - r; j <= y + r; j++) {
. ~, a* c+ _1 l3 Q7 ]0 N) y+ d0 Q8 U                    if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {
5 C6 J5 \. B" q- x9 {( n; }$ X( e9 x                        points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标& ?/ e  b" P6 p% _! ~7 F' C$ |
                    }* H. S+ i- D) h* C# X/ W. b& i
                }
- L, `2 O- p& q) }  j            }
/ ^2 f8 V( e/ \7 X% y. _: p; x. p        }! D' ?) U  O2 `. b) Q% g' h; y
        return points.size();
; Z$ b8 J# m. n; E1 ]- {    }+ w. f9 C2 Q/ `4 Q# c8 d: ?8 }
}
. p* y! o. X8 _, ~6 m0 i+ F# M! j) R```
% |: A/ d: i; z0 _' n6 S
; `7 b$ E2 h, m: Q% \### 统计包含每个点的矩形数目* {( l% V2 F; h. |" w- S8 d
4 Y) o! |2 ~$ l7 e
与第四题类似,只不过变成了二维的。0 \+ Z; ?6 E! e2 y$ p& k9 e
5 s6 B- [! b( d. f6 v+ ?
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。# b4 ?$ z9 O7 S4 Y" W; m
7 t, Y; o4 x5 {. m# l1 F% }0 }% p
```Java3 B9 Z  _& O2 Y2 u1 v
class Solution {) [& [0 m% A- Z) [$ _' }( D
    public int[] countRectangles(int[][] rectangles, int[][] points) {8 Z" n1 c' I" W+ u8 W0 t
        List<Integer> xs = new ArrayList<>();
" {& E6 E$ ~7 a/ h2 l        for (int[] point : points) {8 G6 C3 W8 ?* C; u, t) d5 C+ S
            xs.add(point[0]);( H8 X5 A% O; k" w
        }
, Y9 G# U3 x5 ^& {: b        for (int[] rectangle : rectangles) {* o2 \5 t1 o' Z# a- ]+ s% G
            xs.add(rectangle[0]);2 ]2 F2 u. u' t
        }
8 E. f0 j  n4 w$ X! {; r        Collections.sort(xs);
& r" E, i+ c) n. B# r8 N( @        xs = new ArrayList<>(new LinkedHashSet<>(xs));# h- m; @( f  R5 [, p: r
        Map<Integer, Integer> map = new HashMap<>();
, ~* B' A/ q$ ~/ N: z        for (int i = 0; i < xs.size(); i++) {
% K6 K+ K5 i  G, d            map.put(xs.get(i), i + 1);
# l# y5 u% e% W, N- m        }/ x! t* @: }4 P" M
        for (int[] point : points) {
/ `( D* a2 K# l! ~2 N6 w            point[0] = map.get(point[0]);( h( I7 U3 }1 c- G6 n: s
        }
8 Q, E8 ]% @2 _) e        for (int[] rectangle : rectangles) {# a. f$ }! L# |2 d- u* w& _2 [: R% Q
            rectangle[0] = map.get(rectangle[0]);
8 R' z' [' v  [% c* w8 E$ i+ r/ x        }$ E( K  Y) ~- B
        int[][] g = new int[100005][105];
9 ^  w7 d& F) {$ p( L; `# I9 h        for (int[] rectangle : rectangles) {
$ \% p6 W. O$ S/ ~3 r; O2 \6 {5 E' B            add(1, 1, 1, g);
: F- [; l6 ^6 z! {$ L8 _% P            add(1, rectangle[1] + 1, -1, g);
! q+ I5 C  e. ?9 g: f3 v            add(rectangle[0] + 1, 1, -1, g);' K0 E6 `. d9 `% F4 S$ G
            add(rectangle[0] + 1, rectangle[1] + 1, 1, g);; o* u- l  q/ @3 e
        }. ~" @3 B+ I. @" ^7 o7 w5 g0 K
        int[] ans = new int[points.length];
0 ~) ~9 ~' s  L4 Q        for (int i = 0; i < points.length; i++) {" u' ~, E6 p; g. f/ J& ~  {
            ans[i] = sum(points[i][0], points[i][1], g);  m$ a5 z  G6 V: m; h8 h$ m- ^
        }
! Y+ y5 k$ [" M3 N        return ans;
/ b' v. \; F3 a0 N% I# H    }
3 d7 w4 \9 p9 G1 S% V
; k8 o* v3 ~* ]) ^( R  K/ g    private void add(int x, int y, int d, int[][] g) {) y$ U/ C. ?  U5 {+ R
        while (x < g.length) {
1 _+ ]* }  F7 G            for (int j = y; j < g[0].length; j += lowbit(j)) {
) H3 `- S! p% _3 h: J                g[x][j] += d;3 C2 H! B4 x3 }6 z
            }
  ?/ |3 \2 F; d; Z0 i# y* H            x += lowbit(x);5 ~$ ~/ r8 P) ^7 l6 i
        }# [5 H; S5 n5 M. Y
    }5 P' k% K- B3 v, r
, |  G) f( ^; z* F$ I
    private int sum(int x, int y, int[][] g) {
: _. }0 a6 O8 X        int ans = 0;
  q: H' W' b" f* d  _/ F9 d        while (x > 0) {
9 f) ?* J) L. B" e. p            for (int j = y; j > 0; j -= lowbit(j)) {7 [# j1 S3 ?/ J6 U: L
                ans += g[x][j];
% n% Z' a$ Q$ x/ T. P+ m. t6 N            }
9 e2 e' F' _8 U1 [            x -= lowbit(x);
6 }1 F6 _  S: k* ]; i0 k8 {- A! j        }
! X8 r7 c- j% m! K8 b6 k/ `        return ans;
  p4 V! Y% m: k" {, r. }    }
) D$ b* h" Z' v0 _) |) x
  z# w) q( W4 v" J    private int lowbit(int x) {# l8 w# u5 `8 E$ q& _
        return x & (-x);
( f4 }3 }' n9 ]1 ]5 S    }5 A0 p) l* G( j1 X; [7 F, U
}
: Z$ h  e4 q4 h+ N# d/ ?/ L( V3 ^```, O: [6 U1 e& A- o, [" V

9 E" ~6 J  }: t3 d### 花期内花的数目
' X! b: ]- j2 ]" B* g% f+ H" \
2 v, h. q5 [# ^' ~2 R, g首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
1 b4 Q( C* p9 w7 C9 ]' S. p" |( {  ?6 K1 ]" a2 w: w
比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。$ B4 j  D+ w' `6 I( m, k9 _' M: {- T

: r5 W! f: s" ^  v' }9 i7 i压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
* S. P) I7 ^! ^- E. w0 x2 W6 [* M+ z8 Q# c8 Q6 u' K
- 给区间 `[l, r]` 加上 `d`- Y9 B, k. m8 H. _2 a5 @. I
- 求点 `x` 的值
/ g3 H$ o4 {; T$ H/ g/ S/ U
" c& b' L8 O3 d0 V) f相当于使用树状数组维护 flowers 的差分数组的前缀和。
- p2 l& s5 j, _4 v: o4 b
# }7 f+ E- K1 \7 U) M: n```java8 i# A% [6 v/ M" u; }% S
class Solution {- Y. e2 I& `" I/ ~4 M4 f% r# b. W
    public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
+ P0 J  H/ @' P0 h        TreeSet<Integer> numSet = new TreeSet<>();% z$ ?. N- X2 ^- T* ^4 W
        for (int[] flower : flowers) {: y! c5 W3 m0 v& z( [
            numSet.add(flower[0]);. u' s( X4 f) i; C9 O
            numSet.add(flower[1]);
2 R/ j, |7 |; c        }
8 u; ]! ^( P$ Z( T) X2 }! t. d7 @& h3 J        for (int person : persons) {. D3 V; p! E. q7 Z# ?  ^  s
            numSet.add(person);5 Z" U" J4 m; [; u  ]
        }
% B6 Y# Y4 o7 l. b. H# a        Map<Integer, Integer> numMap = new HashMap<>();; Q: G* }8 C8 R9 f. z4 \  R
        for (int num : numSet) {
! n. ~8 e: a9 a" n1 y& `6 s            numMap.put(num, numMap.size() + 1);. N0 Y6 P8 L1 c5 p8 \; Y1 K+ J
        }
4 F' b+ o$ d9 n% \        for (int[] flower : flowers) {
4 I+ p, \$ q4 V5 h" J( y            flower[0] = numMap.get(flower[0]);! C$ p- U% U* U( d9 B4 ~
            flower[1] = numMap.get(flower[1]);
9 {/ R# [+ j5 X4 o        }' P8 H9 T& z1 S* p! p3 M5 P
        for (int i = 0; i < persons.length; i++) {
: ?7 Y( M, f. y5 r            persons[i] = numMap.get(persons[i]);# r+ X0 T3 U3 W5 ~& R1 `
        }* p, O  g& {4 }
        // 区间加和,单点查询# H1 a% D- J& K4 [
        int[] sum = new int[numMap.size() + 5];
( v7 |; n4 A1 c, \# Z        for (int[] flower : flowers) {9 j9 C$ F1 Q' @% S
            add(sum, flower[0], 1);
3 o5 Y4 v& |# N) r            add(sum, flower[1] + 1, -1);
6 g; q+ G% ]2 T( _; N0 {' s$ i' q& c# x        }
5 }  V# o7 \+ \( f        int[] res = new int[persons.length];7 ]. z: w/ w* P: E
        for (int i = 0; i < persons.length; i++) {
  D5 ]1 r* p# t" n: t# W0 G- B            res[i] = sum(sum, persons[i]);2 ^/ t1 ]& k# b7 f' I
        }  I  B, {$ K; o: Q; a
        return res;& o( g; C8 d1 x3 p0 q
    }* Z+ x' M5 o( G

. z$ O4 ?/ O4 v: A2 |    private int sum(int[] sum, int x) {
$ q" u; P! d% M$ m9 o* r        int res = 0;& ]* S) V7 x8 A+ `
        while (x > 0) {
& Y: a. d. V  w/ F            res += sum[x];1 J3 U- ]8 t, U' E2 D1 L" b/ @
            x -= lowbit(x);& _& \( V) Q& _& n
        }
( G! h( Z" h& W2 N; t8 f* A5 Q: q        return res;
+ `* b4 A+ f/ \$ v    }" j; b& p4 V9 r9 u

7 B8 y5 Y% k2 m# _/ k& z$ t: P3 F' ?    private void add(int[] sum, int x, int val) {, M4 {* }/ b! n2 A
        while (x < sum.length) {
' q2 F+ r/ S5 k/ a            sum[x] += val;
. y( m5 e" v+ S% V8 Z8 l/ H            x += lowbit(x);/ R6 Z4 _) z3 b# i* X9 M4 _1 X5 z
        }
$ x3 S$ g6 _  S3 u- s0 o/ f/ D4 c    }# P& Z$ R- A) e9 i) j7 Z* P/ X

2 e# _, m4 z  }7 }. ?4 y: m    private int lowbit(int x) {
; R8 v1 g; M8 _% ]3 f8 c. y        return x & (-x);7 t6 \. N: _0 l. H: l
    }
" Q; K3 O- R4 F}( L9 t/ R0 c7 i2 r. h
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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