生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2020 力扣杯全国秋季编程大赛(656/3244,前20.2%)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄 1. 比賽結(jié)果 2. 題目 1. LeetCode LCP 17. 速算機(jī)器人 easy 2. LeetCode LCP 18. 早餐組合 easy 3. LeetCode LCP 19. 秋葉收藏集 medium 4. LeetCode LCP 20. 快速公交 hard 5. LeetCode LCP 21. 追逐游戲 hard
1. 比賽結(jié)果
做出來2題,第三題寫了好長時(shí)間無果。還是實(shí)力太差了,繼續(xù)加油!
有提交成功的選手 3244 人,排 656 名
前幾名大佬太強(qiáng)了!
2. 題目
1. LeetCode LCP 17. 速算機(jī)器人 easy
題目鏈接
小扣在秋日市集發(fā)現(xiàn)了一款速算機(jī)器人。店家對機(jī)器人說出兩個(gè)數(shù)字(記作 x 和 y),請小扣說出計(jì)算指令:
“A” 運(yùn)算:使 x = 2 * x + y; “B” 運(yùn)算:使 y = 2 * y + x。 在本次游戲中,店家說出的數(shù)字為 x = 1 和 y = 0,小扣說出的計(jì)算指令記作僅由大寫字母 A、B 組成的字符串 s,字符串中字符的順序表示計(jì)算順序,請返回最終 x 與 y 的和為多少。
示例
1 :
輸入:s
= "AB"
輸出:
4
解釋:
經(jīng)過一次 A 運(yùn)算后,x
= 2 , y
= 0 。
再經(jīng)過一次 B 運(yùn)算,x
= 2 , y
= 2 。
最終 x 與 y 之和為
4 。提示:
0 <= s
. length
<= 10
s 由
'A' 和
'B' 組成
解題:
class Solution {
public : int calculate ( string s
) { int x
= 1 , y
= 0 ; for ( char c
: s
) { if ( c
== 'A' ) x
= x
* 2 + y
; else y
= y
* 2 + x
; } return x
+ y
; }
} ;
2. LeetCode LCP 18. 早餐組合 easy
題目鏈接
小扣在秋日市集選擇了一家早餐攤位,一維整型數(shù)組 staple 中記錄了每種主食的價(jià)格,一維整型數(shù)組 drinks 中記錄了每種飲料的價(jià)格。 小扣的計(jì)劃選擇一份主食和一款飲料,且花費(fèi)不超過 x 元。 請返回小扣共有多少種購買方案。
注意:答案需要以 1e9 + 7 (1000000007) 為底取模, 如:計(jì)算初始結(jié)果為:1000000008,請返回 1
示例
1 :
輸入:staple
= [ 10 , 20 , 5 ] , drinks
= [ 5 , 5 , 2 ] , x
= 15
輸出:
6
解釋:小扣有
6 種購買方案,所選主食與所選飲料在數(shù)組中對應(yīng)的下標(biāo)分別是:
第
1 種方案:staple
[ 0 ] + drinks
[ 0 ] = 10 + 5 = 15 ;
第
2 種方案:staple
[ 0 ] + drinks
[ 1 ] = 10 + 5 = 15 ;
第
3 種方案:staple
[ 0 ] + drinks
[ 2 ] = 10 + 2 = 12 ;
第
4 種方案:staple
[ 2 ] + drinks
[ 0 ] = 5 + 5 = 10 ;
第
5 種方案:staple
[ 2 ] + drinks
[ 1 ] = 5 + 5 = 10 ;
第
6 種方案:staple
[ 2 ] + drinks
[ 2 ] = 5 + 2 = 7 。示例
2 :
輸入:staple
= [ 2 , 1 , 1 ] , drinks
= [ 8 , 9 , 5 , 1 ] , x
= 9
輸出:
8
解釋:小扣有
8 種購買方案,所選主食與所選飲料在數(shù)組中對應(yīng)的下標(biāo)分別是:
第
1 種方案:staple
[ 0 ] + drinks
[ 2 ] = 2 + 5 = 7 ;
第
2 種方案:staple
[ 0 ] + drinks
[ 3 ] = 2 + 1 = 3 ;
第
3 種方案:staple
[ 1 ] + drinks
[ 0 ] = 1 + 8 = 9 ;
第
4 種方案:staple
[ 1 ] + drinks
[ 2 ] = 1 + 5 = 6 ;
第
5 種方案:staple
[ 1 ] + drinks
[ 3 ] = 1 + 1 = 2 ;
第
6 種方案:staple
[ 2 ] + drinks
[ 0 ] = 1 + 8 = 9 ;
第
7 種方案:staple
[ 2 ] + drinks
[ 2 ] = 1 + 5 = 6 ;
第
8 種方案:staple
[ 2 ] + drinks
[ 3 ] = 1 + 1 = 2 ;提示:
1 <= staple
. length
<= 10 ^ 5
1 <= drinks
. length
<= 10 ^ 5
1 <= staple
[ i
] , drinks
[ i
] <= 10 ^ 5
1 <= x
<= 2 * 10 ^ 5
解題:
對一個(gè)數(shù)組A排序,遍歷另一個(gè)數(shù)組B,在A中二分查找
class Solution {
public : int breakfastNumber ( vector
< int > & staple
, vector
< int > & drinks
, int x
) { sort ( drinks
. begin ( ) , drinks
. end ( ) ) ; long long ans
= 0 , mod
= 1e9 + 7 ; for ( int stp
: staple
) { if ( stp
>= x
) continue ; int target
= x
- stp
; int pos
= bs ( drinks
, target
) ; if ( pos
!= - 1 ) { ans
= ( ans
+ pos
+ 1 ) % mod
; } } return ans
; } int bs ( vector
< int > & arr
, int target
) { int l
= 0 , r
= arr
. size ( ) - 1 , n
= arr
. size ( ) , mid
; while ( l
<= r
) { mid
= ( l
+ r
) / 2 ; if ( arr
[ mid
] > target
) { r
= mid
- 1 ; } else { if ( mid
== n
- 1 || arr
[ mid
+ 1 ] > target
) return mid
; else l
= mid
+ 1 ; } } return - 1 ; }
} ;
1164 ms 146.5 MB
或者對兩個(gè)數(shù)組都排序 雙指針進(jìn)行遍歷
class Solution {
public : int breakfastNumber ( vector
< int > & staple
, vector
< int > & drinks
, int x
) { sort ( staple
. begin ( ) , staple
. end ( ) ) ; sort ( drinks
. begin ( ) , drinks
. end ( ) ) ; long long ans
= 0 , mod
= 1e9 + 7 ; int m
= staple
. size ( ) , n
= drinks
. size ( ) , i
, j
; i
= 0 , j
= n
- 1 ; while ( i
< m
&& j
>= 0 ) { if ( staple
[ i
] + drinks
[ j
] <= x
) { ans
= ( ans
+ j
+ 1 ) % mod
; i
++ ; } else j
-- ; } return ans
; }
} ;
1368 ms 146.4 MB
3. LeetCode LCP 19. 秋葉收藏集 medium
題目鏈接
小扣出去秋游,途中收集了一些紅葉和黃葉,他利用這些葉子初步整理了一份秋葉收藏集 leaves, 字符串 leaves 僅包含小寫字符 r 和 y, 其中字符 r 表示一片紅葉,字符 y 表示一片黃葉。 出于美觀整齊的考慮,小扣想要將收藏集中樹葉的排列調(diào)整成「紅、黃、紅」三部分。每部分樹葉數(shù)量可以不相等 ,但均需大于等于 1 。 每次調(diào)整操作,小扣可以將一片紅葉替換成黃葉或者將一片黃葉替換成紅葉。 請問小扣最少需要多少次 調(diào)整操作才能將秋葉收藏集調(diào)整完畢。
示例
1 :
輸入:leaves
= "rrryyyrryyyrr"
輸出:
2
解釋:調(diào)整兩次,將中間的兩片紅葉替換成黃葉,得到
"rrryyyyyyyyrr" 示例
2 :
輸入:leaves
= "ryr"
輸出:
0
解釋:已符合要求,不需要額外操作提示:
3 <= leaves
. length
<= 10 ^ 5
leaves 中只包含字符
'r' 和字符
'y'
解題:
參考IK大佬的DP
dp[i][0] 是表示到 i 結(jié)束時(shí)全是 紅色R的最少操作次數(shù)
dp[i][1] 是表示到 i 結(jié)束時(shí)形成 RY 的最少操作次數(shù)
dp[i][2] 是表示到 i 結(jié)束時(shí)形成 RYR 的最少操作次數(shù)
class Solution {
public : int minimumOperations ( string leaves
) { int n
= leaves
. size ( ) , i
; vector
< vector
< int >> dp ( n
, vector
< int > ( 3 , INT_MAX
) ) ; if ( leaves
[ 0 ] == 'r' ) dp
[ 0 ] [ 0 ] = 0 ; else dp
[ 0 ] [ 0 ] = 1 ; if ( leaves
[ 1 ] == 'y' ) { dp
[ 1 ] [ 0 ] = dp
[ 0 ] [ 0 ] + 1 ; dp
[ 1 ] [ 1 ] = dp
[ 0 ] [ 0 ] ; } else { dp
[ 1 ] [ 0 ] = dp
[ 0 ] [ 0 ] ; dp
[ 1 ] [ 1 ] = dp
[ 0 ] [ 0 ] + 1 ; } if ( leaves
[ 2 ] == 'r' ) { dp
[ 2 ] [ 0 ] = dp
[ 1 ] [ 0 ] ; dp
[ 2 ] [ 1 ] = min ( dp
[ 1 ] [ 0 ] + 1 , dp
[ 1 ] [ 1 ] + 1 ) ; dp
[ 2 ] [ 2 ] = dp
[ 1 ] [ 1 ] ; } else { dp
[ 2 ] [ 0 ] = dp
[ 1 ] [ 0 ] + 1 ; dp
[ 2 ] [ 1 ] = min ( dp
[ 1 ] [ 0 ] , dp
[ 1 ] [ 1 ] ) ; dp
[ 2 ] [ 2 ] = dp
[ 1 ] [ 1 ] + 1 ; } for ( i
= 3 ; i
< n
; i
++ ) { if ( leaves
[ i
] == 'r' ) { dp
[ i
] [ 0 ] = dp
[ i
- 1 ] [ 0 ] ; dp
[ i
] [ 1 ] = min ( dp
[ i
- 1 ] [ 0 ] + 1 , dp
[ i
- 1 ] [ 1 ] + 1 ) ; dp
[ i
] [ 2 ] = min ( dp
[ i
- 1 ] [ 1 ] , dp
[ i
- 1 ] [ 2 ] ) ; } else { dp
[ i
] [ 0 ] = dp
[ i
- 1 ] [ 0 ] + 1 ; dp
[ i
] [ 1 ] = min ( dp
[ i
- 1 ] [ 1 ] , dp
[ i
- 1 ] [ 0 ] ) ; dp
[ i
] [ 2 ] = min ( dp
[ i
- 1 ] [ 1 ] + 1 , dp
[ i
- 1 ] [ 2 ] + 1 ) ; } } return dp
[ n
- 1 ] [ 2 ] ; }
} ;
704 ms 114.4 MB
4. LeetCode LCP 20. 快速公交 hard
題目鏈接
解題:
5. LeetCode LCP 21. 追逐游戲 hard
題目鏈接
解題:
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔 為你收集整理的LeetCode 2020 力扣杯全国秋季编程大赛(656/3244,前20.2%) 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。