日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 838. 推多米诺(模拟)

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 838. 推多米诺(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

一行中有 N 張多米諾骨牌,我們將每張多米諾骨牌垂直豎立。

在開始時,我們同時把一些多米諾骨牌向左或向右推。

每過一秒,倒向左邊的多米諾骨牌會推動其左側相鄰的多米諾骨牌。

同樣地,倒向右邊的多米諾骨牌也會推動豎立在其右側的相鄰多米諾骨牌。

如果同時有多米諾骨牌落在一張垂直豎立的多米諾骨牌的兩邊,由于受力平衡, 該骨牌仍然保持不變

就這個問題而言,我們會認為正在下降的多米諾骨牌不會對其它正在下降或已經下降的多米諾骨牌施加額外的力。

給定表示初始狀態的字符串 “S” 。
如果第 i 張多米諾骨牌被推向左邊,則 S[i] = 'L';
如果第 i 張多米諾骨牌被推向右邊,則 S[i] = 'R';
如果第 i 張多米諾骨牌沒有被推動,則 S[i] = '.'。

返回表示最終狀態的字符串。

示例 1: 輸入:".L.R...LR..L.." 輸出:"LL.RR.LLRRLL.."示例 2: 輸入:"RR.L" 輸出:"RR.L" 說明:第一張多米諾骨牌沒有給第二張施加額外的力。提示: 0 <= N <= 10^5 表示多米諾骨牌狀態的字符串只含有 'L''R'; 以及 '.';

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/push-dominoes
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 先處理兩邊向外倒的
  • 然后記錄中間的位置,用正負號區分方向
  • 遍歷中間間隔的左右位置的符號,分四種情況(都向左,都向右,不動,向中間倒)
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(中間沒有遇到R)L++;}while(R >= 0 && dominoes[R] != 'L'){if(dominoes[R]=='R')r = R;//右邊連續的最后一個R(中間沒有遇到L)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;//中間的LR的位置記錄下來for(i = L; i <= R; ++i){if(dominoes[i] == 'R')pos.push_back(i+1);//向右為+,+1為避免出現0else 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

  • 優化代碼:在原字符串前面 + L,尾部 + R,最后答案舍去首尾即可,可以簡化代碼量
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;//中間的LR的位置記錄下來for(i = 0; i < n; ++i){if(dominoes[i] == 'R')pos.push_back(i+1);//向右為+,+1為避免出現0else 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/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 838. 推多米诺(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。