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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
### 多个数组求交集3 l" [4 w3 R" S3 q! o$ E! Z
, _, F( n9 S; G$ X) g( g1 O* t- H
使用 Set 求交集即可。* B4 q3 Y7 T& s5 L

, g' w6 H! G: p```Java  P" f$ f' ]" C$ j. @3 W
class Solution {
/ d# Z+ x! F" f; C4 l    public List<Integer> intersection(int[][] nums) {
0 \# y2 m0 x' r5 ^+ D        List<Integer> result = new ArrayList<>();
0 T, P5 W6 h9 _+ W- N: I; d2 W        if (nums.length == 0) {! O" a. W' d# K% S' `9 C4 S
            return result;
- ?9 Z+ D  h" t( i% ?* f  s! M% w# n        }
. M1 y  C( G1 x        List<Integer> list = toList(nums[0]);
5 t9 g' }6 S' u: a5 M        for (int i = 1; i < nums.length; i++) {
1 f2 S0 {. ?* `; [/ j/ {            list = intersection(list, toList(nums[i]));
) B( R/ M' s7 o, o- f( l        }+ M6 G. k/ z. ?* y
        Collections.sort(list);
4 U3 Q0 r! ]% p( \        return list;+ U0 ~& ~# v1 U0 Y) x  G- h
    }& ^1 z" I, W% I/ q% M8 X; Y( n' z
) s+ ^2 J. ~( ~. i4 l
    private List<Integer> toList(int[] nums) {
+ y* M: g! Z# W& K9 t  N) ?+ e* `        List<Integer> list = new ArrayList<>();
+ w5 `* K/ [" {$ X2 f) G        for (int num : nums) {# A. i' G& A- L' p
            list.add(num);- n* v: N/ F! E8 ~& a
        }) ?' V8 {; ?+ e  Z5 d& P" n+ D: y
        return list;5 K" o; N% ]; Y2 H
    }1 `. f2 B* C/ R

. ~4 y/ r, R- U0 o- I9 p1 p    private List<Integer> intersection(List<Integer> list1, List<Integer> list2) {
7 V8 Z& ~3 d- i' @/ A, R        List<Integer> result = new ArrayList<>();; r; ^) S; |& Y: L, J
        Set<Integer> set = new HashSet<>(list1);  j5 C  L# n$ E
        for (int n : list2) {+ w8 ?; S& N. v5 \
            if (set.contains(n)) {
" X. }% f) `* T4 i: F% a                result.add(n);
, M7 `' y- p3 o+ S                set.remove(n);/ B* N6 Q% w8 u! i
            }
6 G- y6 H9 P' f        }
2 i' x; p9 ~; m; d        return result;0 B. B% z* S* b+ W
    }6 O0 Q( f  c. w% `! P4 Y  q+ x
}
  \5 S- z4 [& Y) K- J```
2 \! h/ A( P* p. Z2 F5 k: h. E  Y5 A$ r1 G
### 统计圆内格点数目. F% k1 U7 }( _

3 |/ e; |' N6 B, `! F+ k7 A枚举每个圆内的所有的点,将其加入到 Set 中,最后 Set 的大小即为圆内格点数目。1 W! z; z* n$ {3 b; }5 {: u3 ^

& ^4 Z: a' A! {! G3 e( u4 y```Java) O- G, g* K9 c( c, f
class Solution {
) |6 B! m+ b; u7 F% Y& e    public int countLatticePoints(int[][] circles) {
; i  S$ h7 r7 O3 b        Set<Long> points = new HashSet<>();* R& `8 o- s# h- P! r
        for (int[] circle : circles) {* U  J, j8 [, W, P. c/ v" D' c
            int x = circle[0];
& p# H5 K/ W/ P! o0 b5 m# |* P  Y            int y = circle[1];
, ^+ S0 h, W9 D0 q' M            int r = circle[2];$ c7 }! s+ ]4 }, w8 _/ ~
            // 出于便利,直接枚举正方形区域,然后判断是否在圆内
) R9 X: @" F- h' N6 x$ |            for (int i = x - r; i <= x + r; i++) {
; q4 U' M/ r6 e( j                for (int j = y - r; j <= y + r; j++) {
% r: F5 B  _( {2 J2 x" t                    if (Math.abs(i - x) * Math.abs(i - x) + Math.abs(j - y) * Math.abs(j - y) <= r * r) {# B5 Z9 S4 c3 i5 Q
                        points.add((long) i << 32 | j); // 使用 long 的高 32 位表示 x 坐标,低 32 位表示 y 坐标! Y3 k: _9 ~3 v
                    }
% B- k5 l# F: P8 x' j                }
) c8 K: M$ F6 C( ?+ w            }
4 |$ u5 C, s& A8 y5 J* X        }
$ Y5 M& N5 f  U4 V# L! ]+ `        return points.size();
8 Z) ~( ~. m/ t  ~" A6 k5 Y    }: O. Y+ V0 Z* O6 o2 y" d6 ?
}, T8 _0 c) d' k* k1 I" {
```% J. _9 k1 |2 u3 l6 c7 S
, b" f4 L; P. e( ?3 i  q' n) U
### 统计包含每个点的矩形数目4 i. Q: V3 A9 J  ]

9 G" O% G: ^0 `) k0 K" O  @与第四题类似,只不过变成了二维的。8 @) J$ m: `1 z7 h) ^  C- f

& W9 I+ a. w+ x! r- C: u; @  ]先离散化处理,然后使用树状数组实现 “区间加、单点查” 的能力。
2 K1 K! ?% l9 P. I4 X, l! g% \  d  M) S  ?7 V) W
```Java# |7 {# C9 B! h
class Solution {
. N2 h( B2 C* f2 k  z% ~( t+ I    public int[] countRectangles(int[][] rectangles, int[][] points) {
* y$ @% g" l8 V2 r4 U. i/ C        List<Integer> xs = new ArrayList<>();" C/ R& u3 f3 T
        for (int[] point : points) {
  x  c% z  e" M- ~5 x8 o            xs.add(point[0]);
6 B- r/ h6 H! |0 F4 k/ W3 E        }8 w2 h, J: c+ Q3 X
        for (int[] rectangle : rectangles) {4 U3 T& Z- b9 k2 A; G7 p8 b
            xs.add(rectangle[0]);
6 ]9 j) J$ Y" L) r) {3 o        }/ C9 ^2 x, w6 N4 t$ r& y# U- S) ]9 o
        Collections.sort(xs);2 e  f; q" x  J5 _5 y
        xs = new ArrayList<>(new LinkedHashSet<>(xs));
+ x+ W! c; M$ W" A4 K2 e6 q6 i' o        Map<Integer, Integer> map = new HashMap<>();0 W" L& R" m3 N& ]  p
        for (int i = 0; i < xs.size(); i++) {
8 q) G. |, S$ H- X$ k            map.put(xs.get(i), i + 1);, T) b9 _- [" i/ C: r
        }$ t( M6 _8 m. S
        for (int[] point : points) {
0 c+ L) V7 H: |/ v$ O- S! Z0 J/ K            point[0] = map.get(point[0]);
7 ~. M' u$ W6 \' m  C        }
5 e2 z. }/ R1 |: b! M  E        for (int[] rectangle : rectangles) {! V& r! I+ H7 @' u/ p: a
            rectangle[0] = map.get(rectangle[0]);
: j1 j/ M) a1 H! ]        }& ?. g2 ~) A. a8 T1 Y
        int[][] g = new int[100005][105];
2 @1 Q$ r- S& r  h        for (int[] rectangle : rectangles) {
2 h7 u  E7 j, ]+ q( [            add(1, 1, 1, g);7 ~& [) l& f) ?: W$ H
            add(1, rectangle[1] + 1, -1, g);) \8 j) f  K: t4 G& V: {0 ^- J
            add(rectangle[0] + 1, 1, -1, g);2 F8 }$ t1 ], C
            add(rectangle[0] + 1, rectangle[1] + 1, 1, g);
+ E1 A; E1 e  g; z& c8 x% l6 m5 a        }. }1 l. T( |; g* B1 ?/ ^
        int[] ans = new int[points.length];( ?* R! T: w) y
        for (int i = 0; i < points.length; i++) {; ~) x- n! B1 ^& E* \' ?& T
            ans[i] = sum(points[i][0], points[i][1], g);) {* Q  Y2 `* t5 Q' m3 \
        }# m5 t  d# o  a+ K& L
        return ans;4 Z9 u; r9 H0 `: w/ W9 j; A" P4 _' [8 D1 i
    }$ _, f4 ]* F5 @8 {

  D1 E- `+ U3 B" [$ c) n    private void add(int x, int y, int d, int[][] g) {
) P8 G( b: Y/ F0 e2 ]* N        while (x < g.length) {) l( J: i; d" p
            for (int j = y; j < g[0].length; j += lowbit(j)) {
& [1 a9 k/ G' p' h0 `0 i# a5 D                g[x][j] += d;! p0 p7 A3 h8 M2 _7 a# t6 P
            }
( Y0 g# Z3 k8 _4 G$ @            x += lowbit(x);
+ i7 Y5 F7 a/ i6 X( e7 ]( J1 D6 u1 Z        }% O! @- `4 q" M  h+ r( x
    }# z( ^9 A' |! Q$ h6 l
( R/ |6 U& K" V2 F
    private int sum(int x, int y, int[][] g) {  V* H9 ]( M2 v6 a7 X$ H  I. S
        int ans = 0;
; f, B# I4 `* A* ?2 O7 |        while (x > 0) {* L- ~$ e2 v& @( }5 v5 ?
            for (int j = y; j > 0; j -= lowbit(j)) {! Z- U6 K, `/ I+ O6 c
                ans += g[x][j];
- ]0 A0 S4 C/ i: u  ?            }
5 R, ]6 Q: T! ~. o8 Y' M0 O            x -= lowbit(x);
6 M  l* C" x6 L  v        }: A9 l9 `# F3 r$ d+ N
        return ans;4 j- L0 C+ G- R2 T$ h4 T$ q
    }0 n7 x2 p6 a9 a/ X- v
4 o6 `8 }5 I2 Q! g  W
    private int lowbit(int x) {$ @6 l% I, ?$ x" C" z8 _; W0 \
        return x & (-x);/ Q" N& B3 ~6 Q) Z; V( Q* _
    }
: U( F! d) x; C% _6 `}8 a3 i, `4 G+ `; c9 F6 u% B
```/ H6 P- R( y& r& k- y1 T; }

6 x6 ~: g2 c5 d2 ^2 d### 花期内花的数目
  G7 K3 V% i, K& }$ e
1 ~, @0 y; i+ }9 x6 F  T首先进行离散化处理,`start[i]`, `end[i]`, `person[i]` 的原始数据范围都是 10^9, 实际上可以对他们进行压缩,也并不影响正确性。) Q! ~! k0 J* M( \

/ X# C$ N1 _1 S比如 `[[5, 10], [100, 200]], [1, 2, 3]` 可以被压缩成 `[[4, 5], [6, 7]], [1, 2, 3]`。
& ~, c! l1 {& @: t5 m' K
; u8 O6 d8 u3 U压缩后我们使用树状数组实现 “区间加、单点查” 的功能,即支持如下两种操作:
2 S0 c. T' W% e- P2 W3 o. d
8 `$ ]1 F& o, j% h6 t# H& ~( a- 给区间 `[l, r]` 加上 `d`
( g+ h1 |2 g6 I7 p" V% E- 求点 `x` 的值( O( P  H0 ^; u

: P" g4 g0 M$ {: I& a相当于使用树状数组维护 flowers 的差分数组的前缀和。
/ C$ ]1 i1 U/ F" ]# t3 B" c. d' T' y0 p6 d
```java2 r, U6 \7 |6 Q, p7 x. }7 U3 J* }
class Solution {
: n) N4 l6 |9 O& K. ?6 e    public int[] fullBloomFlowers(int[][] flowers, int[] persons) {
: x$ ?7 M- N" M) M: L+ H        TreeSet<Integer> numSet = new TreeSet<>();
, v& @, x: v% [# N: ?/ r        for (int[] flower : flowers) {
* x0 y: _* P$ Q/ O            numSet.add(flower[0]);
% E7 W+ T5 C4 F+ x0 J% ^            numSet.add(flower[1]);$ B, G# S- ~  I, E; r! e7 I0 X* L
        }8 R' W; C; ~5 }& T+ Z  j+ S
        for (int person : persons) {* k! H/ Z; y  A  H8 o
            numSet.add(person);
: r# B4 Q: i9 s% z, J' B        }$ g2 g* a; d  Y2 R) [6 I* |
        Map<Integer, Integer> numMap = new HashMap<>();7 m( ?% Q. k: }+ F) r/ V
        for (int num : numSet) {; ]7 l0 t; H, P0 K
            numMap.put(num, numMap.size() + 1);
* [; l1 T  M: v+ L3 J        }
" J4 J0 u. ~# [7 n; G        for (int[] flower : flowers) {! x) x5 Z, N6 ^, x
            flower[0] = numMap.get(flower[0]);
, Z% C( X  q! b7 O2 B            flower[1] = numMap.get(flower[1]);
$ Y4 A! h/ Z2 p/ r8 Q8 R- h        }
8 M7 \2 ]3 m1 f* J; e0 C& h        for (int i = 0; i < persons.length; i++) {% v: k1 g4 n+ @2 B& ]: s
            persons[i] = numMap.get(persons[i]);
9 d( o8 n4 F& ?/ z% d' x        }( |+ x% ~& A- E9 l& }
        // 区间加和,单点查询6 i2 f) g( A6 L
        int[] sum = new int[numMap.size() + 5];% C9 l3 x$ n! C
        for (int[] flower : flowers) {
7 I0 L' K5 c# g            add(sum, flower[0], 1);
/ e* |/ `5 v7 k: v# j2 N! d" S            add(sum, flower[1] + 1, -1);
6 l% J" o1 ^7 g        }  b0 J7 J4 W3 K7 x; ?3 ?
        int[] res = new int[persons.length];5 ?* O' W( E1 O2 w% \- G. L
        for (int i = 0; i < persons.length; i++) {# m! P8 l+ @! s8 r" f' b  \
            res[i] = sum(sum, persons[i]);
1 F; H* L) }7 \2 W; n        }
( K& `& F( U0 ~1 V, q1 Q1 U        return res;" f5 c% u# j8 a- j
    }' U$ q6 Q0 e: B
4 F$ O. P" C6 m6 \" k
    private int sum(int[] sum, int x) {5 z! n: o3 a+ \; h. V
        int res = 0;* z0 u! z" t* f, S9 k2 A& w4 \# Z
        while (x > 0) {
4 X) |7 G: {! M! w6 [& b- m            res += sum[x];
. z! y5 k; S1 @4 @            x -= lowbit(x);
# m% G+ z; p+ g0 c        }3 e% F# p+ S: A0 {& U2 [  V
        return res;+ X/ F. G3 P9 @( G1 \' g; M( C; s
    }: A+ [$ }7 U' n3 ]& b

# W5 B. K& H' e8 \+ p    private void add(int[] sum, int x, int val) {3 {, F* M/ y, n5 H$ ~# X4 ~4 i
        while (x < sum.length) {& h9 M, v9 `& }* r6 e. c8 s
            sum[x] += val;- C  ^! y6 G1 |5 l  }+ q: A' s
            x += lowbit(x);
+ g/ @- E8 Y; u' y% W+ V' P+ M        }
( ~! w9 X' [0 g2 {3 ~% u9 a$ P8 W    }, j3 i1 p' H9 e: E/ i
) |: C! v8 V5 Z% x3 V; U( H4 S* ~
    private int lowbit(int x) {
6 K6 Z3 ~6 O9 a) f% a; T: ~        return x & (-x);- B2 V2 `/ L2 Z. o! q6 b* }
    }+ x( Y1 R8 K' N) G/ g& V
}
) T) g3 f9 ]0 E; z
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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