生活随笔
收集整理的這篇文章主要介紹了
LeetCode 第 22 场双周赛(220/2041,前10.8%)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄 1. 比賽結果 2. 題目 LeetCode 5348. 兩個數組間的距離值 easy LeetCode 5349. 安排電影院座位 medium LeetCode 5350. 將整數按權重排序 medium LeetCode 5351. 3n 塊披薩 hard
1. 比賽結果
做出來了前3題,第4題有點難,感覺是動態規劃。
全國排名:220 / 2041,10.8%;全球排名:729 / 5630,12.9%
2. 題目
LeetCode 5348. 兩個數組間的距離值 easy
題目鏈接
給你兩個整數數組 arr1 , arr2 和一個整數 d ,請你返回兩個數組之間的 距離值 。
「距離值」 定義為符合此描述的元素數目:對于元素 arr1[i] ,不存在任何元素 arr2[j] 滿足 |arr1[i]-arr2[j]| <= d 。
示例
1 :
輸入:arr1
= [ 4 , 5 , 8 ] , arr2
= [ 10 , 9 , 1 , 8 ] , d
= 2
輸出:
2
解釋:
對于 arr1
[ 0 ] = 4 我們有:
| 4 - 10 | = 6 > d
= 2
| 4 - 9 | = 5 > d
= 2
| 4 - 1 | = 3 > d
= 2
| 4 - 8 | = 4 > d
= 2
對于 arr1
[ 1 ] = 5 我們有:
| 5 - 10 | = 5 > d
= 2
| 5 - 9 | = 4 > d
= 2
| 5 - 1 | = 4 > d
= 2
| 5 - 8 | = 3 > d
= 2
對于 arr1
[ 2 ] = 8 我們有:
| 8 - 10 | = 2 <= d
= 2
| 8 - 9 | = 1 <= d
= 2
| 8 - 1 | = 7 > d
= 2
| 8 - 8 | = 0 <= d
= 2 示例
2 :
輸入:arr1
= [ 1 , 4 , 2 , 3 ] , arr2
= [ - 4 , - 3 , 6 , 10 , 20 , 30 ] , d
= 3
輸出:
2 示例
3 :
輸入:arr1
= [ 2 , 1 , 100 , 3 ] , arr2
= [ - 5 , - 2 , 10 , - 3 , 7 ] , d
= 6
輸出:
1 提示:
1 <= arr1
. length
, arr2
. length
<= 500
- 10 ^ 3 <= arr1
[ i
] , arr2
[ j
] <= 10 ^ 3
0 <= d
<= 100
解答:
class Solution {
public : int findTheDistanceValue ( vector
< int > & arr1
, vector
< int > & arr2
, int d
) { int i
, j
, count
= 0 ; bool flag
; for ( i
= 0 ; i
< arr1
. size ( ) ; i
++ ) { flag
= true ; for ( j
= 0 ; j
< arr2
. size ( ) ; j
++ ) { if ( abs ( arr1
[ i
] - arr2
[ j
] ) <= d
) { flag
= false ; break ; } } if ( flag
) count
++ ; } return count
; }
} ;
執行用時:8 ms 內存消耗:8.3 MB
LeetCode 5349. 安排電影院座位 medium
題目鏈接 如上圖所示,電影院的觀影廳中有 n 行座位,行編號從 1 到 n ,且每一行內總共有 10 個座位,列編號從 1 到 10 。
給你數組 reservedSeats ,包含所有已經被預約了的座位。比如說,researvedSeats[i]=[3,8] ,它表示第 3 行第 8 個座位被預約了。
請你返回 最多 能安排多少個 4 人家庭 。4 人家庭要占據 同一行內連續 的 4 個座位。隔著過道的座位(比方說 [3,3] 和 [3,4])不是連續的座位,但是如果你可以將 4 人家庭拆成過道兩邊各坐 2 人,這樣子是允許的。
示例 1:
輸入:n
= 3 , reservedSeats
= [ [ 1 , 2 ] , [ 1 , 3 ] , [ 1 , 8 ] , [ 2 , 6 ] , [ 3 , 1 ] , [ 3 , 10 ] ]
輸出:
4
解釋:上圖所示是最優的安排方案,總共可以安排
4 個家庭。
藍色的叉表示被預約的座位,橙色的連續座位表示一個
4 人家庭。示例
2 :
輸入:n
= 2 , reservedSeats
= [ [ 2 , 1 ] , [ 1 , 8 ] , [ 2 , 6 ] ]
輸出:
2 示例
3 :
輸入:n
= 4 , reservedSeats
= [ [ 4 , 3 ] , [ 1 , 4 ] , [ 4 , 6 ] , [ 1 , 7 ] ]
輸出:
4 提示:
1 <= n
<= 10 ^ 9
1 <= reservedSeats
. length
<= min ( 10 * n
, 10 ^ 4 )
reservedSeats
[ i
] . length
== 2
1 <= reservedSeats
[ i
] [ 0 ] <= n
1 <= reservedSeats
[ i
] [ 1 ] <= 10
所有 reservedSeats
[ i
] 都是互不相同的。
解題:
超時做法,先按排,排序,然后按排,統計一排的情況,做出判斷,判斷n排 缺點,n 非常大,會超時
class Solution {
public : int maxNumberOfFamilies ( int n
, vector
< vector
< int >> & Seats
) { int count
= 0 , line
= 1 , i
= 0 ; sort ( Seats
. begin ( ) , Seats
. end ( ) , [ & ] ( auto a
, auto b
) { if ( a
[ 0 ] != b
[ 0 ] ) return a
[ 0 ] < b
[ 0 ] ; return a
[ 1 ] < b
[ 1 ] ; } ) ; for ( line
= 1 ; line
<= n
; ++ line
) { bitset
< 11 > b
; while ( i
< Seats
. size ( ) && Seats
[ i
] [ 0 ] == line
) { b
. set ( Seats
[ i
] [ 1 ] , 1 ) ; i
++ ; } if ( b
. count ( ) == 0 || ( ! b
[ 2 ] && ! b
[ 3 ] && ! b
[ 4 ] && ! b
[ 5 ] && ! b
[ 6 ] && ! b
[ 7 ] && ! b
[ 8 ] && ! b
[ 9 ] ) ) count
+ = 2 ; else if ( ( ! b
[ 2 ] && ! b
[ 3 ] && ! b
[ 4 ] && ! b
[ 5 ] ) && ( b
[ 6 ] || b
[ 7 ] || b
[ 8 ] || b
[ 9 ] ) ) count
+ = 1 ; else if ( ( ! b
[ 6 ] && ! b
[ 7 ] && ! b
[ 8 ] && ! b
[ 9 ] ) && ( b
[ 2 ] || b
[ 3 ] || b
[ 4 ] || b
[ 5 ] ) ) count
+ = 1 ; else if ( ( ! b
[ 4 ] && ! b
[ 5 ] && ! b
[ 6 ] && ! b
[ 7 ] ) && ( b
[ 2 ] || b
[ 3 ] ) && ( b
[ 8 ] || b
[ 9 ] ) ) count
+ = 1 ; } return count
; }
} ;
采用 map + bitset 存儲 座位情況 遍歷 所有的 bitset ,分類討論即可 跳過沒有座位坐人的排,直接 +2
class Solution {
public : int maxNumberOfFamilies ( int n
, vector
< vector
< int >> & Seats
) { int count
= 0 , line
= 1 , i
= 0 ; map
< int , bitset
< 11 >> m
; for ( auto & st
: Seats
) { m
[ st
[ 0 ] ] . set ( st
[ 1 ] ) ; } bitset
< 11 > b
; for ( auto & mi
: m
) { b
= mi
. second
; if ( ! b
[ 2 ] && ! b
[ 3 ] && ! b
[ 4 ] && ! b
[ 5 ] && ! b
[ 6 ] && ! b
[ 7 ] && ! b
[ 8 ] && ! b
[ 9 ] ) count
+ = 2 ; else if ( ( ! b
[ 2 ] && ! b
[ 3 ] && ! b
[ 4 ] && ! b
[ 5 ] ) && ( b
[ 6 ] || b
[ 7 ] || b
[ 8 ] || b
[ 9 ] ) ) count
+ = 1 ; else if ( ( ! b
[ 6 ] && ! b
[ 7 ] && ! b
[ 8 ] && ! b
[ 9 ] ) && ( b
[ 2 ] || b
[ 3 ] || b
[ 4 ] || b
[ 5 ] ) ) count
+ = 1 ; else if ( ( ! b
[ 4 ] && ! b
[ 5 ] && ! b
[ 6 ] && ! b
[ 7 ] ) && ( b
[ 2 ] || b
[ 3 ] ) && ( b
[ 8 ] || b
[ 9 ] ) ) count
+ = 1 ; } return count
+ 2 * ( n
- m
. size ( ) ) ; }
} ;
執行用時:180 ms 內存消耗:42.3 MB
LeetCode 5350. 將整數按權重排序 medium
題目鏈接
我們將整數 x 的 權重 定義為按照下述規則將 x 變成 1 所需要的步數:
如果 x 是偶數,那么 x = x / 2 如果 x 是奇數,那么 x = 3 * x + 1 比方說,x=3 的權重為 7 。因為 3 需要 7 步變成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。
給你三個整數 lo, hi 和 k 。你的任務是將區間 [lo, hi] 之間的整數按照它們的權重 升序排序 ,如果大于等于 2 個整數有 相同 的權重,那么按照數字自身的數值 升序排序 。
請你返回區間 [lo, hi] 之間的整數按權重排序后的第 k 個數。
注意,題目保證對于任意整數 x (lo <= x <= hi) ,它變成 1 所需要的步數是一個 32 位有符號整數。
示例
1 :
輸入:lo
= 12 , hi
= 15 , k
= 2
輸出:
13
解釋:
12 的權重為
9 (
12 -- > 6 -- > 3 -- > 10 -- > 5 -- > 16 -- > 8 -- > 4 -- > 2 -- > 1 )
13 的權重為
9
14 的權重為
17
15 的權重為
17
區間內的數按權重排序以后的結果為
[ 12 , 13 , 14 , 15 ] 。對于 k
= 2 ,答案是第二個整數也就是
13 。
注意,
12 和
13 有相同的權重,所以我們按照它們本身升序排序。
14 和
15 同理。示例
2 :
輸入:lo
= 1 , hi
= 1 , k
= 1
輸出:
1 示例
3 :
輸入:lo
= 7 , hi
= 11 , k
= 4
輸出:
7
解釋:區間內整數
[ 7 , 8 , 9 , 10 , 11 ] 對應的權重為
[ 16 , 3 , 19 , 6 , 14 ] 。
按權重排序后得到的結果為
[ 8 , 10 , 11 , 7 , 9 ] 。
排序后數組中第
4 個數字為
7 。示例
4 :
輸入:lo
= 10 , hi
= 20 , k
= 5
輸出:
13 示例
5 :
輸入:lo
= 1 , hi
= 1000 , k
= 777
輸出:
570 提示:
1 <= lo
<= hi
<= 1000
1 <= k
<= hi
- lo
+ 1
解題:
class Solution {
public : int getKth ( int lo
, int hi
, int k
) { vector
< int > v ( hi
- lo
+ 1 ) ; int j
= 0 ; for ( int i
= lo
; i
<= hi
; i
++ ) v
[ j
++ ] = i
; sort ( v
. begin ( ) , v
. end ( ) , [ & ] ( int a
, int b
) { int wa
= calw ( a
) , wb
= calw ( b
) ; if ( wa
== wb
) return a
< b
; return wa
< wb
; } ) ; return v
[ k
- 1 ] ; } int calw ( int x
) { int count
= 0 ; while ( x
!= 1 ) { if ( x
% 2 ) x
= 3 * x
+ 1 ; else x
= x
/ 2 ; count
++ ; } return count
; }
} ;
執行用時:236 ms 內存消耗:8.8 MB
LeetCode 5351. 3n 塊披薩 hard
題目鏈接
給你一個披薩,它由 3n 塊不同大小的部分組成,現在你和你的朋友們需要按照如下規則來分披薩:
你挑選 任意 一塊披薩。 Alice 將會挑選你所選擇的披薩逆時針 方向的下一塊披薩。 Bob 將會挑選你所選擇的披薩順時針 方向的下一塊披薩。 重復上述過程直到沒有披薩剩下。
每一塊披薩的大小按順時針 方向由循環數組 slices 表示。
請你返回你可以獲得的披薩大小總和的最大值 。
示例 1:
輸入:slices
= [ 1 , 2 , 3 , 4 , 5 , 6 ]
輸出:
10
解釋:選擇大小為
4 的披薩,Alice 和 Bob 分別挑選大小為
3 和
5 的披薩。
然后你選擇大小為
6 的披薩,Alice 和 Bob 分別挑選大小為
2 和
1 的披薩。
你獲得的披薩總大小為
4 + 6 = 10 。
示例 2:
輸入:slices
= [ 8 , 9 , 8 , 6 , 1 , 1 ]
輸出:
16
解釋:兩輪都選大小為
8 的披薩。如果你選擇大小為
9 的披薩,你的朋友們就會選擇大小為
8 的披薩,這種情況下你的總和不是最大的。示例
3 :
輸入:slices
= [ 4 , 1 , 2 , 5 , 8 , 3 , 1 , 9 , 7 ]
輸出:
21 示例
4 :
輸入:slices
= [ 3 , 1 , 2 ]
輸出:
3 提示:
1 <= slices
. length
<= 500
slices
. length
% 3 == 0
1 <= slices
[ i
] <= 1000
解題:
class Solution {
public : int maxSizeSlices ( vector
< int > & slices
) { int i
, j
, n
= slices
. size ( ) / 3 , k
= slices
. size ( ) ; int prev_max
= 0 ; vector
< vector
< int >> dp1 ( n
, vector
< int > ( k
, 0 ) ) ; vector
< vector
< int >> dp2 ( n
, vector
< int > ( k
, 0 ) ) ; dp1
[ 0 ] = slices
; dp2
[ 0 ] = slices
; for ( i
= 1 ; i
< n
; ++ i
) { prev_max
= 0 ; for ( j
= 0 ; j
< k
- 1 ; ++ j
) { if ( j
- 2 >= 0 ) prev_max
= max ( prev_max
, dp1
[ i
- 1 ] [ j
- 2 ] ) ; dp1
[ i
] [ j
] = prev_max
+ slices
[ j
] ; } prev_max
= 0 ; for ( j
= 1 ; j
< k
; ++ j
) { if ( j
- 2 >= 1 ) prev_max
= max ( prev_max
, dp2
[ i
- 1 ] [ j
- 2 ] ) ; dp2
[ i
] [ j
] = prev_max
+ slices
[ j
] ; } } return max ( * max_element ( dp1
[ n
- 1 ] . begin ( ) , dp1
[ n
- 1 ] . end ( ) ) , * max_element ( dp2
[ n
- 1 ] . begin ( ) , dp2
[ n
- 1 ] . end ( ) ) ) ; }
} ;
總結
以上是生活随笔 為你收集整理的LeetCode 第 22 场双周赛(220/2041,前10.8%) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。