<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)241:為運(yùn)算表達(dá)式設(shè)計(jì)優(yōu)先級

          共 5995字,需瀏覽 12分鐘

           ·

          2021-04-23 10:54

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做 為運(yùn)算表達(dá)式設(shè)計(jì)優(yōu)先級,我們先來看題面:
          https://leetcode-cn.com/problems/different-ways-to-add-parentheses/

          Given a string expression of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. You may return the answer in any order.

          給定一個(gè)含有數(shù)字和運(yùn)算符的字符串,為表達(dá)式添加括號(hào),改變其運(yùn)算優(yōu)先級以求出不同的結(jié)果。你需要給出所有可能的組合的結(jié)果。有效的運(yùn)算符號(hào)包含 +, - 以及 * 。

          示例


          示例 1:

          輸入: "2-1-1"
          輸出: [0, 2]
          解釋:
          ((2-1)-1) = 0
          (2-(1-1)) = 2

          示例 2:

          輸入: "2*3-4*5"
          輸出: [-34, -14, -10, -10, 10]
          解釋:
          (2*(3-(4*5))) = -34
          ((2*3)-(4*5)) = -14
          ((2*(3-4))*5) = -10
          (2*((3-4)*5)) = -10
          (((2*3)-4)*5) = 10


          解題

          https://blog.csdn.net/qq_21201267/article/details/105731156
          • dp[i][j]存儲(chǔ)區(qū)間[i,j]內(nèi)可能的結(jié)果數(shù)值

          • 先初始化dp[i][i],dp[i][i+1]

          • 然后按照區(qū)間長度 len 不斷加大 dp[i][i+len] = sum(dp[i][j] op dp[j+1][i+len]) j 在區(qū)間內(nèi)遍歷,左右的數(shù)組合進(jìn)行運(yùn)算的值,存入dp[i][i+len]


          class Solution {
          public:
              vector<int> diffWaysToCompute(string input) {
                int i, j, k, num=0;
                vector<int> arr;//數(shù)字存起來
                vector<char> op;//操作符存起來
                for(i = 0; i < input.size(); ++i)
                {
                  if(!isdigit(input[i]))
                  {
                    arr.push_back(num);
                    op.push_back(input[i]);
                    num = 0;
                  }
                  else
                    num = num*10+input[i]-'0';
                }
                  arr.push_back(num);//最后一個(gè)數(shù)字
                int n = arr.size();
                vector<vector<vector<int>>> dp(n,vector<vector<int>>(n));
                for(i = 0; i < n-1; ++i)
                  {
                      dp[i][i] = {arr[i]};//初始化dp[i][i]
                      if(op[i]=='+')
                      dp[i][i+1] = {arr[i]+arr[i+1]};//初始化dp[i][i+1]
                      else if(op[i]=='-')
                          dp[i][i+1] = {arr[i]-arr[i+1]};
                      else if(op[i]=='*')
                          dp[i][i+1] = {arr[i]*arr[i+1]};
                  }
                  dp[n-1][n-1] = {arr[n-1]};//初始化dp[i][i]
                for(int len = 2; len < n; ++len)
                { //按長度dp
                  for(i = 0; i < n-len; ++i)
                  { //左端點(diǎn)
                          for(j = i; j < i+len; ++j)
                          { //中間端點(diǎn)
                              for(int dl : dp[i][j])
                              { //左邊的數(shù)值
                                  for(int dr : dp[j+1][i+len])//左邊的數(shù)值
                                      if(op[j]=='+')
                                          dp[i][i+len].push_back(dl+dr);
                                      else if(op[j]=='-')
                                          dp[i][i+len].push_back(dl-dr);
                                      else if(op[j]=='*')
                                          dp[i][i+len].push_back(dl*dr);
                              }
                          }
                  }
                }
                sort(dp[0][n-1].begin(),dp[0][n-1].end());
                return dp[0][n-1];
              }
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-240題匯總,希望對你有點(diǎn)幫助!

          瀏覽 66
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久人妻无码毛片A片麻豆 | 91人妻在线视频 | 国产精品一二三级 | 九色在线视频 | 中文字幕日本精品5 |