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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

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

本版积分规则

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