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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
### 多个数组求交集9 Q6 K* x* M+ L
$ o! g- a: X% Y' y: R
使用 Set 求交集即可。# b! t$ y8 n) |# E$ q, O" x

# a8 o* g4 N8 K- T' I; t```Java
7 l0 X8 P4 s+ x& O8 Cclass Solution {; ^* L4 }: C2 Z% h6 b  Q
    public List<Integer> intersection(int[][] nums) {$ j* f; r8 [7 C) j. B$ \/ o7 \( U
        List<Integer> result = new ArrayList<>();4 x! y" l9 Y: s- O1 u6 ~
        if (nums.length == 0) {
. s0 O) u2 A/ g9 R' o. V' O) ]            return result;
5 L' w  |. A+ z" n3 V: h( o        }
9 \( |6 s2 l3 e% \$ p! b4 a% j" t        List<Integer> list = toList(nums[0]);" ]" z8 a8 y$ C
        for (int i = 1; i < nums.length; i++) {' G" b3 D6 {0 k! c
            list = intersection(list, toList(nums[i]));7 Z% W9 D# b, S
        }: e9 U1 u# {" w% n8 \, D
        Collections.sort(list);
+ M: l3 }4 h! e        return list;, j4 W: v4 G7 K8 v% Y/ H
    }( a, P- m/ I, V& g1 S; k

7 Y, u$ F. b$ l/ T    private List<Integer> toList(int[] nums) {* I; c1 E6 J  v! f0 |
        List<Integer> list = new ArrayList<>();7 ^& _/ J" ^  i7 a* d- M
        for (int num : nums) {
/ J" {1 [, G8 f) e- v# ~. t5 k5 G            list.add(num);
* F$ i8 }! p6 p8 [% b' `' B        }
5 X) T, d! ]# M. P        return list;
: r/ `& z5 O2 e6 _, ^/ `5 L/ X    }
+ `* B; i! x, N. S! g  m. w
! o; i3 ^. P! K/ {5 @0 a    private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {( |1 [1 Y, U1 M1 q& o7 y- u
        List<Integer> result = new ArrayList<>();
# W5 G: f: s6 D        Set<Integer> set = new HashSet<>(list1);6 s3 v( ~- h& x; V' {
        for (int n : list2) {+ c* L2 l4 u- U
            if (set.contains(n)) {
" o! Q5 ?4 x) y5 C7 z8 _9 {                result.add(n);
4 E1 }% W3 L& K  b/ s  a                set.remove(n);( O/ z. ]1 \. `5 [% f
            }, _+ J5 M5 w% ?' O- V6 t7 D8 d
        }( |0 i+ p* N9 H" j' h5 l8 B7 P
        return result;& h  X1 i/ ?& j" ]' ]
    }
) P6 N: A. b* v4 r9 o}4 p( K! y4 J# A; C" L( G+ V7 y$ I9 y5 t
```
7 E1 ^- R/ g% w! c# ~
4 l7 h  Z6 G9 I7 t### 统计圆内格点数目
& j% g; o0 V& T  R) k! a
& e4 W8 a" M8 |* B' ^枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。
" i8 g4 a, g8 ]* |) u* @# P: I" D
```Java
+ C2 X' W& C7 |class Solution {
3 ~" S, ]$ i  D) @! ]' A    public int countLatticePoints(int[][] circles) {
! e. N0 [( Q, Y$ z7 N& U& i1 ]        Set<Long> points = new HashSet<>();
/ R1 ^6 E* |9 u$ x  u( V/ ~1 _/ g        for (int[] circle : circles) {
# m0 W- s, a$ l, @! s            int x = circle[0];6 h/ {$ W7 s, r' |# O
            int y = circle[1];
, U: b' ~6 \: Y* w5 D            int r = circle[2];( _: r9 u' b8 e" [, l/ m' D
            // 出于便利,直接枚举正方形区域,然后判断是否在圆内
. J4 C- b- e6 l            for (int i = x - r; i <= x + r; i++) {' w4 J+ ^- [# L4 t- R
                for (int j = y - r; j <= y + r; j++) {
8 p8 d( U5 f& O- k8 u9 c                    if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {- T& x9 V% t: e
                        points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标0 ^. G5 |( S% `
                    }
0 |* Z  m0 r; {  b* }                }7 f/ t& \: M, a% P
            }7 B: R, U. r! w, B, l6 `
        }  F$ g1 X  s( f; |, M6 T+ O
        return points.size();
5 z7 K4 n' P2 {% c3 I    }+ x- \$ D1 E7 `" k$ j5 S
}/ K& I: |0 t/ N. I8 V5 N
```; o0 B5 f0 U! F7 @' O, X& i

! z! X5 X7 e. T3 q0 Z6 v### 统计包含每个点的矩形数目
( j( X8 c7 ?* ^8 k, I& n
/ S5 H1 W" q7 \5 m, b与第四题类似,只不过变成了二维的。
5 p4 V0 m8 t4 @8 ?% h) b& @% z& s6 S! T  a7 w, Y6 j* e
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。( }7 O1 F1 T- ~6 N2 x6 [* U

; _7 r: ?  b8 B, H  ?! D```Java5 j- r# ^7 e, [" V1 i6 k8 W8 @' \
class Solution {
/ g# k+ ^5 h, p! d$ M) I% N    public int[] countRectangles(int[][] rectangles, int[][] points) {, a- O' i, |" @8 |* f
        List<Integer> xs = new ArrayList<>();* _* k3 J% L# p4 g  L! ?' B" c: ~
        for (int[] point : points) {/ G0 Q% b7 \# M# v+ _5 I
            xs.add(point[0]);
( K1 B( z/ Y$ N- S2 H        }3 \+ J- n5 t, I
        for (int[] rectangle : rectangles) {
, y( Y* f1 B  Q0 N: I  }            xs.add(rectangle[0]);
; o8 i; W1 a% ~. k( g! M/ W0 R9 D        }, D+ [$ l( Z; a/ M7 B
        Collections.sort(xs);
% T" l  ^# l9 w; @, S; e        xs = new ArrayList<>(new LinkedHashSet<>(xs));
3 k4 n. z) g# M7 u! n        Map<Integer, Integer> map = new HashMap<>();
! |% F% ?: F- a) N  I: r8 ?- Z        for (int i = 0; i < xs.size(); i++) {6 _* |0 |6 s8 v, l& p
            map.put(xs.get(i), i + 1);
1 d6 V, W, s, R! N, ]        }
) w7 v( S; R* y7 `/ Y6 n        for (int[] point : points) {+ i; x' k' x% o0 X% B, ]
            point[0] = map.get(point[0]);, v* p/ p4 L; `- ~( y
        }/ `( |# y- |4 a6 K# Z
        for (int[] rectangle : rectangles) {8 h+ n* E1 B6 p3 N2 S
            rectangle[0] = map.get(rectangle[0]);
# ]1 j( T6 }% T( G# K        }
* y% x: g0 G; N. T( \        int[][] g = new int[100005][105];
; F! A" I$ C! _' G: Q6 i: H' X* W        for (int[] rectangle : rectangles) {
6 g0 @7 q: N" l6 N" `            add(1, 1, 1, g);
3 G2 S/ V5 ~. R( E            add(1, rectangle[1] + 1, -1, g);
/ G9 t5 f2 g  e4 M/ |            add(rectangle[0] + 1, 1, -1, g);" V, V( c0 _9 D7 p; W+ D
            add(rectangle[0] + 1, rectangle[1] + 1, 1, g);7 r, t# \# c3 Z
        }
& g) w+ k9 C! k( U4 L) M        int[] ans = new int[points.length];1 R7 w# f' N$ \7 [1 }& K
        for (int i = 0; i < points.length; i++) {- v2 I4 t, Y5 J  ?3 G8 F9 c0 S7 X" P
            ans[i] = sum(points[i][0], points[i][1], g);6 U4 {  ]) Z( A/ r
        }
+ l  U, D5 G/ ?; t  [        return ans;
6 F5 q, M$ K! d! h" ]% @) A! c( H( a    }
2 O  O+ U0 S9 b' n3 V& F
) f* z% J7 U' c0 ]    private void add(int x, int y, int d, int[][] g) {
' k- V' E9 r& N+ W        while (x < g.length) {
5 Q& [1 L# Q/ ~3 U- @4 [            for (int j = y; j < g[0].length; j += lowbit(j)) {
* ^. M0 M; V+ q2 I/ V$ V                g[x][j] += d;
" t( Y7 p1 m8 y  ?  O            }& [9 q# d. [$ N; A
            x += lowbit(x);) f$ W$ L8 y8 v. P& j1 ~9 i7 i
        }
4 I% f6 S5 d# V3 r    }
4 B7 i. v2 t. Q" U
+ m) [% ~1 o) T( z    private int sum(int x, int y, int[][] g) {" `2 S6 Z' M" n8 [
        int ans = 0;! X" v) Y; ?- V2 ]* [% N8 @0 T
        while (x > 0) {2 b4 U7 e( e9 g4 _4 J, p
            for (int j = y; j > 0; j -= lowbit(j)) {
7 D/ q# T& Z( V1 ]9 l1 L1 s                ans += g[x][j];6 S( ]" \- ?- F+ |7 a
            }4 c) D6 n+ l; U
            x -= lowbit(x);
, F; u( {' V) `9 t$ V: K        }8 F- V$ i! g4 E7 S  [" W' V2 B
        return ans;
4 c1 u! E8 t  t" x/ b, g+ E: J    }' Z9 T& z7 l5 e3 v9 |

. s5 S- ~, @% U& U) z& ^: U    private int lowbit(int x) {/ N" O* U) e0 I3 F6 }
        return x & (-x);( m9 f9 u; E0 `# a! s
    }  N" m9 D0 `" h7 F4 q
}7 r- c( n7 K% ?6 h
```+ A+ ~5 N! }$ w! q

* {9 _0 s4 L% q) H: S: {  `### 花期内花的数目
$ G. |, E' z! J: X1 n6 |- c8 u5 X/ @1 }4 Y8 _) k0 G/ b9 C
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。
% e5 r- ~8 p. e9 ]8 q4 X( f$ G- ?5 J' @: O7 h& f5 r% f" q
比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
8 U% [! s) H$ z( J2 F# v9 y. m4 {% R- ]# m7 W
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
/ G# y5 c6 k4 y) k( w. F' a3 I$ o$ V6 Y2 p9 a% g
- 给区间 `[l, r]` 加上 `d`
' [, O: g0 h- d/ J8 h- 求点 `x` 的值4 U( Z  G& N( `' l. X- M+ p
; f, X) n! k5 ]) o
相当于使用树状数组维护 flowers 的差分数组的前缀和。4 I/ P$ ?0 p# s2 z9 ^9 ?$ z
! c, @4 a; N  P  }% B
```java4 ^) G( |/ W* Z6 S
class Solution {7 i6 t8 P5 p, Y& \. |; W
    public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
5 n& a3 C( v, `4 }0 m3 i" P6 K        TreeSet<Integer> numSet = new TreeSet<>();
7 q! N* \( E) q- Q        for (int[] flower : flowers) {) V7 ^2 f8 p% K+ }0 j# U6 s
            numSet.add(flower[0]);
4 b; {- R) z" c: B; P/ y            numSet.add(flower[1]);: ^6 R% F1 ?/ ~; j2 u! Y1 Q/ N! r
        }
9 T* \2 n$ ^3 s( L1 T        for (int person : persons) {
* G8 E4 j  Q9 _4 I+ x  i            numSet.add(person);$ t: }! Z" E) @" U5 z( h: a/ @
        }
5 B: L. a) b# f; D        Map<Integer, Integer> numMap = new HashMap<>();
; z2 {) e* b4 q: K; j: E        for (int num : numSet) {
1 e( `' ?2 _6 t2 k            numMap.put(num, numMap.size() + 1);9 h4 ^8 Y+ r& L" W' Z3 {
        }
$ o- T" E: ^! H% x7 p2 h) O        for (int[] flower : flowers) {% }4 H* z3 {3 w  l
            flower[0] = numMap.get(flower[0]);
" ^+ \6 B7 V6 }0 Q. C) B            flower[1] = numMap.get(flower[1]);! E6 V) m1 S2 S: v2 x/ l* j
        }
2 K9 S* `. J* `& d) j& F) n        for (int i = 0; i < persons.length; i++) {
3 p* _; X$ P: N6 W& Q            persons[i] = numMap.get(persons[i]);4 M+ {0 W- `; R* ^6 H: E2 p
        }
- i/ ]4 \9 {* \) `9 Z. Y' m1 ^        // 区间加和,单点查询
* {& W2 _( `; u9 V        int[] sum = new int[numMap.size() + 5];
0 q8 P) u& [4 ^        for (int[] flower : flowers) {
) W% j, `/ N4 v+ D: F5 e. H0 a& p/ t            add(sum, flower[0], 1);* z" H! f' p/ z7 i8 j
            add(sum, flower[1] + 1, -1);; ^) k. y& }6 v8 R4 k; z: q9 [7 H
        }
$ N( V# H1 n6 f  p5 t        int[] res = new int[persons.length];
, K5 l- J  l& n; l0 y0 ^7 _        for (int i = 0; i < persons.length; i++) {- U/ e0 u+ b4 C  C3 \
            res[i] = sum(sum, persons[i]);, ~3 ~8 w/ d/ T" ^* ]( O
        }
( P% z2 O, D+ N        return res;. M6 d* I2 p/ n$ y# h$ A
    }
; O* F- ]% M$ l' H) {6 i* ?- l9 q
    private int sum(int[] sum, int x) {
: z5 a* F3 m/ q* {        int res = 0;/ Q7 X) _6 ?7 }; [! w/ q! h
        while (x > 0) {
" d, s: j) D  M# h3 W, Z            res += sum[x];$ U5 @% S( h) `. n- Y' L& l
            x -= lowbit(x);: [# z5 @+ S- D- N9 T( i$ d
        }
+ F5 O7 Z; H. `( {! c8 f        return res;
; f) m9 a7 i( y. W    }' M  d' R( @5 S* t5 k

1 I2 b2 M2 K3 ~/ @9 t" U    private void add(int[] sum, int x, int val) {
  q, H6 \/ [7 d% O6 L% }9 a        while (x < sum.length) {. ]$ K! t# O0 L/ z, Y
            sum[x] += val;& |: q' F9 u9 q$ h' {" m
            x += lowbit(x);
2 D, I0 m! M7 d% m9 Z  ?        }
+ u2 P/ ^# N9 c4 E8 D    }
# h5 |' x5 C3 f; L" q# f
. u" X7 Y6 j8 `5 {6 y4 `9 k    private int lowbit(int x) {$ `. P4 \- l6 P4 K) P/ l
        return x & (-x);
3 X; D4 b6 G5 Q- u    }
" ]1 k& J$ a8 P! A9 ?}
2 I  x: j+ u6 B( @
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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