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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
### 多个数组求交集
# ?' P. I6 f* G' t
0 ]) \; {9 O3 G使用 Set 求交集即可。1 [5 O5 r+ d+ V% s

+ w2 k- P1 ]% ^```Java& }( G: u" z! P  ^5 Z, o! j
class Solution {
2 R# E* ]% h# O4 W' p5 A0 H: ?    public List<Integer> intersection(int[][] nums) {
- z3 o: g% u2 P/ I        List<Integer> result = new ArrayList<>();' j, e" }, T& R0 }' \  |! c
        if (nums.length == 0) {0 I9 b$ C& x" s7 g+ }
            return result;2 Y% I7 f( _* ~- j) R0 M7 T; ^
        }
' X0 G4 T6 j! `. K        List<Integer> list = toList(nums[0]);' L7 F. o/ i3 Q/ P( d% @5 y* ], q
        for (int i = 1; i < nums.length; i++) {* u8 ^/ }5 r1 L* T, m9 K
            list = intersection(list, toList(nums[i]));
* g: V% f" v1 I        }( _' {" L, Y* s1 e
        Collections.sort(list);
+ b/ s9 B0 y! g. D2 r- F        return list;* `* v- D0 S; s$ Q
    }% u& @* x/ Z. i1 p+ I( N

/ w9 m. s" x! ~4 N& S    private List<Integer> toList(int[] nums) {
) F5 c# D& v8 f) L% L        List<Integer> list = new ArrayList<>();3 M  }: |/ u/ L* S% `5 J& }
        for (int num : nums) {
8 ?* \% w9 e' z" D/ q            list.add(num);
5 ?5 I8 u. d* ?: X6 h; D9 z        }. r" R% e5 Y2 {( y3 N" E! L
        return list;' \6 b0 e/ f. J
    }
" }4 ^# A8 ?8 J% |) _* \. g, }  E) D! E: f3 q7 n, J  p' n
    private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {0 D# p1 S# C; H" ]2 f
        List<Integer> result = new ArrayList<>();
/ C& `' c' o' V% {1 O" ?3 ^# {8 |        Set<Integer> set = new HashSet<>(list1);
4 ^* j$ \. U1 c( \0 @: @        for (int n : list2) {
( X3 O9 h( h( i8 n5 @3 C            if (set.contains(n)) {
* L6 c2 i  N4 Z, |, v                result.add(n);% ~5 r$ W5 m4 r8 l8 Q5 i# s
                set.remove(n);% r7 _0 Z4 v2 z0 O+ l: h2 F$ m& j
            }% ]2 l0 g. `0 j+ c  F& j$ D/ ]; ^8 G
        }
" `" C$ R3 t% I. b$ f! l: U        return result;( f; [9 ]( k* l+ k
    }7 Z. H' X. H$ e, P8 ]6 a: u
}
# I; N1 S) Y4 N4 O  P```
4 m  C% B3 p' r2 Q& f
& h( W$ v6 t, S1 z1 I### 统计圆内格点数目
' s0 z# z# l" d/ R( g, C" b1 c) \. r# I
枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。  L+ K* c8 Q7 @  S- @' F
& A, }- c% o! M  I3 i4 D6 v
```Java' W* {$ M8 P5 ?
class Solution {
3 Y& f/ o/ x# p* K: t9 [    public int countLatticePoints(int[][] circles) {0 E9 ]5 b2 z! g- m
        Set<Long> points = new HashSet<>();
: }7 S1 d% v- G: i, e9 Q7 W        for (int[] circle : circles) {* }: Q4 e8 u/ m" e( Q% K
            int x = circle[0];- X  H/ ^3 s4 q9 t1 @. w, K; v
            int y = circle[1];) i0 r9 ?2 t! G! k: R6 `3 l
            int r = circle[2];
+ G4 f8 A. ^8 s: k1 ?5 b            // 出于便利,直接枚举正方形区域,然后判断是否在圆内
$ t9 m9 l+ A& @* J9 {. x+ V; N            for (int i = x - r; i <= x + r; i++) {
6 O4 Y* p5 Y: v% p$ Q                for (int j = y - r; j <= y + r; j++) {
7 l9 t$ q" S  G3 p& M, H                    if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {
( v: [& a! L# I" P8 L) s6 I                        points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标3 R+ {7 h4 k( }! U
                    }$ f  P8 J  q9 H$ G& }( u' l  p
                }4 Z) Z. Q) n9 A; m- J
            }( b0 U! ^- e7 F
        }
* s" }8 t% q' E% T& ^( z        return points.size();
  x4 ]* S' l" Z% ?    }- F) F& P/ v) M; j' i  Y1 _1 U4 K
}
0 r& w4 e! g+ }9 [: L```
3 }6 B% c; N# {2 c6 r' X5 _* A5 C8 W0 Z6 d# r" i7 p: |( Y8 j
### 统计包含每个点的矩形数目
. T6 X# q& K5 Y, H; O, t: O6 U  l! o! J, U8 v9 \
与第四题类似,只不过变成了二维的。
  v* W5 z: l' d# }* M/ V% g/ l/ b/ T6 f4 c( F
先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。4 ?4 ]* i7 e6 o* _  b6 K% D

* {6 E+ y2 Y) ^8 o```Java
7 g* w$ n# c  ~7 {$ n0 wclass Solution {) ~1 X" g6 g( V; L( o0 ^: C& D
    public int[] countRectangles(int[][] rectangles, int[][] points) {
) ^& @8 m8 n5 Z, b. z' }        List<Integer> xs = new ArrayList<>();
  |0 G$ C6 B+ N$ d+ ?        for (int[] point : points) {
4 i% K$ t, g9 G( }3 d" t( o( B7 g3 |            xs.add(point[0]);
. I2 S0 X0 b; Y" T0 j        }% ^, I: m2 T8 ]9 g1 _
        for (int[] rectangle : rectangles) {8 W; O6 X; v0 @; b/ |
            xs.add(rectangle[0]);; e! y4 W! J% F) O$ n6 X  ]# s
        }
; Q# a+ Z! u, L, ^8 \        Collections.sort(xs);
  h* B% E. J9 k3 M        xs = new ArrayList<>(new LinkedHashSet<>(xs));
# e4 A6 i0 G4 A- L! G8 _3 Z        Map<Integer, Integer> map = new HashMap<>();
- {; _- `+ A* C* D        for (int i = 0; i < xs.size(); i++) {
. z9 K  Q  L% ^. H2 C            map.put(xs.get(i), i + 1);* t; B% q- K* a
        }
$ n* Y5 F/ _: Q3 y4 o1 w        for (int[] point : points) {2 j7 K" m0 w8 w) j  r: Q% h
            point[0] = map.get(point[0]);* r# }( ^0 s+ S- ]3 a# P1 \# I  M
        }: _) _! N2 y9 a2 n7 Z; i, _/ G
        for (int[] rectangle : rectangles) {' n( w8 M; L9 @
            rectangle[0] = map.get(rectangle[0]);
( I: H$ t3 r: V9 n        }3 m" r6 M1 z3 V  ?  R
        int[][] g = new int[100005][105];: y2 n* b! \1 |
        for (int[] rectangle : rectangles) {
0 [' ?/ H, P8 j0 H: f            add(1, 1, 1, g);
0 n/ F* l+ X7 A$ {2 E            add(1, rectangle[1] + 1, -1, g);( A3 n6 ~+ r: V1 W  N9 E
            add(rectangle[0] + 1, 1, -1, g);
8 h* p% l/ r, h; @            add(rectangle[0] + 1, rectangle[1] + 1, 1, g);( K1 {3 `$ x' _  c; V* N6 D# ]
        }; v7 E& x5 {4 w
        int[] ans = new int[points.length];
% J6 X% [; K, b8 v1 g( N- M" |7 D& W        for (int i = 0; i < points.length; i++) {3 l1 `# G5 s: ]3 p% W
            ans[i] = sum(points[i][0], points[i][1], g);
) x+ f+ p! v5 v8 j        }
; e! O1 {& Q5 ^2 X4 L( K" r        return ans;" ?: |+ }6 g$ D% q8 J2 [0 l. B" F
    }8 I* ?2 z5 f- m3 z9 A1 y* {; ^$ U

5 a5 l  o7 v# Z4 p  Z. }2 s    private void add(int x, int y, int d, int[][] g) {
8 y$ f9 I3 j- m        while (x < g.length) {
2 o) n* s$ D) C  o" ^' I+ S& E            for (int j = y; j < g[0].length; j += lowbit(j)) {8 h$ r/ B- m# k0 r) u
                g[x][j] += d;
' _8 P/ g6 k* N9 j/ j) _            }
- @0 W  y6 v! r  Z; p1 @! {7 M8 L            x += lowbit(x);" M. ?" B( i& H7 m# Q
        }
. \' c/ l1 B' D# t3 y    }
3 T. e" m& [" ^- ~( g: w( Y9 z: e
    private int sum(int x, int y, int[][] g) {8 l, Q$ p" X& _# s2 v& r$ e
        int ans = 0;
; R3 l0 `) A; U6 u        while (x > 0) {+ W+ z' y2 P3 b2 L5 b) z5 ^( H3 i
            for (int j = y; j > 0; j -= lowbit(j)) {
0 Q/ p1 r/ B* i                ans += g[x][j];3 ~: z( N9 C. s5 t$ b4 C6 C
            }% V. _! d  \; R2 U/ P' J
            x -= lowbit(x);$ X8 d) a7 I; y, P  Q5 {* u
        }
- J7 ?# w8 P2 U5 A        return ans;
: q9 H* M. V- B8 F6 b9 B$ T5 E    }
5 w! ?9 |6 b3 b$ ^+ S5 \3 |
5 O5 ?+ }# K7 }) {0 x! c4 u    private int lowbit(int x) {0 M, f: n: v( G
        return x & (-x);" M/ d4 g. S2 @0 @% y' s
    }
. X8 r7 |& X  H$ x' H/ b+ e}9 B: F( e( E# u" `6 j! j: J* _  K
```
" [4 n8 b- J0 F/ g8 ?& v! z# n! w. q. ?- }% d1 n
### 花期内花的数目
; x9 U8 g: u0 W: @2 J2 d; V& V5 u$ R& {9 w2 Q: C) v+ w
首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。( `+ ^7 v# a+ B* H

9 I: ^4 D. i2 @- D* Q+ I: L" N比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
' Z% H: [' X8 s) z4 w3 N0 R, L; v- Q5 J- I5 h* \3 S" r
压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:. ^3 f5 m: b( e- C
$ g1 \; ^$ a7 b4 B& ^: Q
- 给区间 `[l, r]` 加上 `d`3 o7 S7 G: }+ o+ A; o# D
- 求点 `x` 的值# r( N0 f& V: Q$ p" N$ L, u1 s9 m  d

! i7 a9 P6 I7 A+ |- e9 Y! Y相当于使用树状数组维护 flowers 的差分数组的前缀和。
0 f& p, e  O* A  {' P, V& E6 `7 W* A
2 K! {! z" J- O```java
4 {$ W6 n" l& I. \/ [class Solution {
& K5 d( a" |! G- }, E    public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
' R0 l5 k2 ^% W! \1 W/ D        TreeSet<Integer> numSet = new TreeSet<>();
5 U3 I; @0 Q, O3 `: x( m# e+ z" g        for (int[] flower : flowers) {
! L# L8 x5 l- N, T" @# u            numSet.add(flower[0]);5 T/ G! ]9 f0 W( \- ?7 Q' C
            numSet.add(flower[1]);) o6 D. V  K8 t5 f' W! i# u
        }, z( |! k$ V8 l8 w2 a. Q, Q
        for (int person : persons) {. c! H6 n9 m' [# y' v8 z
            numSet.add(person);8 |9 {7 e, B2 N
        }9 L5 p! M2 T' L: l
        Map<Integer, Integer> numMap = new HashMap<>();/ y5 o3 Q4 ^. ^3 H! }* N
        for (int num : numSet) {# p$ Y6 K3 o& G. o
            numMap.put(num, numMap.size() + 1);
. }: t8 y/ f+ y0 C        }2 a" d+ V/ j! m4 w  t- @# Y. |
        for (int[] flower : flowers) {. l- P% R% L$ F0 |+ r
            flower[0] = numMap.get(flower[0]);
( [/ ]' F7 a+ H( K5 P: y' {2 B& K# V            flower[1] = numMap.get(flower[1]);3 P# |! v  |. s4 w0 S
        }- q$ J+ [, z! d
        for (int i = 0; i < persons.length; i++) {
0 u7 s; S/ j& {! Q            persons[i] = numMap.get(persons[i]);
( l7 `2 ]3 R& N- ~        }9 o  w. ?+ R8 j, \' @2 T
        // 区间加和,单点查询2 ]5 b  h7 s* ?" U2 @" C0 w- ^
        int[] sum = new int[numMap.size() + 5];# ^) H& @+ P' j
        for (int[] flower : flowers) {% Y9 y0 ~. d/ f8 n/ w
            add(sum, flower[0], 1);
. `5 h# z* T; p6 `            add(sum, flower[1] + 1, -1);
& a8 U# q4 T3 x0 z1 T# M5 ]        }
  y) U9 S- k+ l, f; W8 X$ M7 U        int[] res = new int[persons.length];
6 k9 F9 `* i4 R4 q        for (int i = 0; i < persons.length; i++) {) n" y& |% K) ~) ]/ }; W7 x
            res[i] = sum(sum, persons[i]);
, n( l! G; w% b$ D# h        }
  C' @3 {2 t7 E& q3 W2 [        return res;, {2 M& G, [8 O
    }
. }. l; k: z6 X4 I) l- I$ V$ X' r9 k/ Z# W$ }
    private int sum(int[] sum, int x) {3 Q2 ^" u* h, [  k7 b6 U
        int res = 0;
. {! H, `! D3 n# f5 W, V5 V% C        while (x > 0) {0 o) h  c7 {) ~5 d! p9 T# ?& B
            res += sum[x];
1 X7 B+ C) o4 O( h            x -= lowbit(x);4 h9 z. j# a5 J( o
        }
' m# M) c7 n5 e$ K$ a9 k        return res;
! Z! {! M" I: N; t: {: W    }
/ W6 K4 E0 s8 z6 |
* w, @5 E- K# x! s3 s3 @    private void add(int[] sum, int x, int val) {( T9 s4 ]: y6 m: A4 e8 U
        while (x < sum.length) {7 q* Z9 F6 S' O, \3 m/ r3 F
            sum[x] += val;
! G  c# ?. d5 W( A# n            x += lowbit(x);
+ [+ L$ K, l' @4 j: J- e8 m% |        }
8 C$ b2 i) n9 u8 `    }2 ]& o& W/ b% I! R

) {6 H1 F7 ?  \7 K) y  l    private int lowbit(int x) {
9 s. V  d; v% M7 [4 O        return x & (-x);' o: `) {4 R! m3 x9 o9 }% O5 Y
    }7 y: H8 s+ N% k: }
}# N0 @8 `7 }6 s, J7 w% }6 }9 l2 Q
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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