生活随笔
收集整理的這篇文章主要介紹了
LeetCode 838. 推多米诺(模拟)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
1. 題目
一行中有 N 張多米諾骨牌,我們將每張多米諾骨牌垂直豎立。
在開(kāi)始時(shí),我們同時(shí)把一些多米諾骨牌向左或向右推。
每過(guò)一秒,倒向左邊的多米諾骨牌會(huì)推動(dòng)其左側(cè)相鄰的多米諾骨牌。
同樣地,倒向右邊的多米諾骨牌也會(huì)推動(dòng)豎立在其右側(cè)的相鄰多米諾骨牌。
如果同時(shí)有多米諾骨牌落在一張垂直豎立的多米諾骨牌的兩邊,由于受力平衡, 該骨牌仍然保持不變。
就這個(gè)問(wèn)題而言,我們會(huì)認(rèn)為正在下降的多米諾骨牌不會(huì)對(duì)其它正在下降或已經(jīng)下降的多米諾骨牌施加額外的力。
給定表示初始狀態(tài)的字符串 “S” 。
如果第 i 張多米諾骨牌被推向左邊,則 S[i] = 'L';
如果第 i 張多米諾骨牌被推向右邊,則 S[i] = 'R';
如果第 i 張多米諾骨牌沒(méi)有被推動(dòng),則 S[i] = '.'。
返回表示最終狀態(tài)的字符串。
示例
1:
輸入:
".L.R...LR..L.."
輸出:
"LL.RR.LLRRLL.."示例
2:
輸入:
"RR.L"
輸出:
"RR.L"
說(shuō)明:第一張多米諾骨牌沒(méi)有給第二張施加額外的力。提示:
0 <= N
<= 10^5
表示多米諾骨牌狀態(tài)的字符串只含有
'L',
'R'; 以及
'.';
來(lái)源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/push-dominoes
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 先處理兩邊向外倒的
- 然后記錄中間的位置,用正負(fù)號(hào)區(qū)分方向
- 遍歷中間間隔的左右位置的符號(hào),分四種情況(都向左,都向右,不動(dòng),向中間倒)
class Solution {
public:string
pushDominoes(string dominoes
) {int n
= dominoes
.size(), L
= 0, R
= n
-1, l
=-1, r
=-1, i
;while(L
< n
&& dominoes
[L
] != 'R'){if(dominoes
[L
]=='L')l
= L
;L
++;}while(R
>= 0 && dominoes
[R
] != 'L'){if(dominoes
[R
]=='R')r
= R
;R
--;}if(l
!= -1)for(i
= l
-1; i
>= 0; i
--)dominoes
[i
] = 'L';if(r
!= -1)for(i
= r
+1; i
< dominoes
.size(); i
++)dominoes
[i
] = 'R';vector
<int> pos
;for(i
= L
; i
<= R
; ++i
){if(dominoes
[i
] == 'R')pos
.push_back(i
+1);else if(dominoes
[i
] == 'L')pos
.push_back(-(i
+1));}for(i
= 0; i
< int(pos
.size())-1; ++i
){if(pos
[i
] > 0 && pos
[i
+1] > 0){l
= pos
[i
], r
= pos
[i
+1]-1;while(l
< r
)dominoes
[l
++] = 'R';}else if(pos
[i
] < 0 && pos
[i
+1] < 0){ l
= -pos
[i
], r
= -pos
[i
+1]-1;while(l
< r
)dominoes
[l
++] = 'L';}else if(pos
[i
] > 0 && pos
[i
+1] < 0){ l
= pos
[i
], r
= -pos
[i
+1]-2;while(l
< r
){dominoes
[l
++] = 'R';dominoes
[r
--] = 'L';}}}return dominoes
;}
};
40 ms 11 MB
- 優(yōu)化代碼:在原字符串前面 + L,尾部 + R,最后答案舍去首尾即可,可以簡(jiǎn)化代碼量
class Solution {
public:string
pushDominoes(string dominoes
) {dominoes
= 'L'+dominoes
+'R';int n
= dominoes
.size(), L
= 0, R
= n
-1, l
, r
, i
;vector
<int> pos
;for(i
= 0; i
< n
; ++i
){if(dominoes
[i
] == 'R')pos
.push_back(i
+1);else if(dominoes
[i
] == 'L')pos
.push_back(-(i
+1));}for(i
= 0; i
< int(pos
.size())-1; ++i
){if(pos
[i
] > 0 && pos
[i
+1] > 0){l
= pos
[i
], r
= pos
[i
+1]-1;while(l
< r
)dominoes
[l
++] = 'R';}else if(pos
[i
] < 0 && pos
[i
+1] < 0){ l
= -pos
[i
], r
= -pos
[i
+1]-1;while(l
< r
)dominoes
[l
++] = 'L';}else if(pos
[i
] > 0 && pos
[i
+1] < 0){ l
= pos
[i
], r
= -pos
[i
+1]-2;while(l
< r
){dominoes
[l
++] = 'R';dominoes
[r
--] = 'L';}}}return dominoes
.substr(1,n
-2);}
};
36 ms 12.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 838. 推多米诺(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。