<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)351:安卓系統(tǒng)手勢(shì)解鎖

          共 3396字,需瀏覽 7分鐘

           ·

          2021-08-20 00:05

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

          今天和大家聊的問題叫做 安卓系統(tǒng)手勢(shì)解鎖,我們先來看題面:
          https://leetcode-cn.com/problems/android-unlock-patterns/

          Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total number of unlock patterns of the Android lock screen, which consist of minimum of m keys and maximum n keys.


          我們都知道安卓有個(gè)手勢(shì)解鎖的界面,是一個(gè) 3 x 3 的點(diǎn)所繪制出來的網(wǎng)格。
          給你兩個(gè)整數(shù),分別為 m 和 n,其中 1 ≤ m ≤ n ≤ 9,那么請(qǐng)你統(tǒng)計(jì)一下有多少種解鎖手勢(shì),是至少需要經(jīng)過 m 個(gè)點(diǎn),但是最多經(jīng)過不超過 n 個(gè)點(diǎn)的。

          先來了解下什么是一個(gè)有效的安卓解鎖手勢(shì):
          每一個(gè)解鎖手勢(shì)必須至少經(jīng)過 m 個(gè)點(diǎn)、最多經(jīng)過 n 個(gè)點(diǎn)。
          解鎖手勢(shì)里不能設(shè)置經(jīng)過重復(fù)的點(diǎn)。
          假如手勢(shì)中有兩個(gè)點(diǎn)是順序經(jīng)過的,那么這兩個(gè)點(diǎn)的手勢(shì)軌跡之間是絕對(duì)不能跨過任何未被經(jīng)過的點(diǎn)。
          經(jīng)過點(diǎn)的順序不同則表示為不同的解鎖手勢(shì)。

          示例

          解題

          https://blog.csdn.net/qq_21201267/article/details/107738912

          參考官方題解,判斷是否有效,比較難寫

          class Solution {
            vector<bool> visited;
          public:
              int numberOfPatterns(int m, int n) {
                int ans = 0;
                for(int len = m; len <= n; ++len)
                {
                  visited = vector<bool> (9, false);
                  ans += cal(-1,len);
                }
                return ans;
              }

              bool isok(int idx, int last)
              
          {
                if(visited[idx]) return false;
                if(last == -1) return true;//第一個(gè)數(shù)
                if((idx+last)%2 == 1) return true;//相鄰的兩個(gè)數(shù)
                int mid = (idx+last)/2;
                if(mid == 4)//對(duì)角線的兩個(gè)端點(diǎn)要連起來
                  return visited[mid];//看中點(diǎn)是否占用
                if(idx%3 != last%3 && idx/3 != last/3)
                  return true;//不是 同行,或者 同列 的兩個(gè)端點(diǎn)
                return visited[mid];//檢查0,6,中間是3,有沒有被占用
              }
              int cal(int last, int len)
              
          {
                if(len == 0) return 1;
                int sum = 0;
                for(int i = 0; i < 9; ++i)
                {
                  if(isok(i, last))
                  {
                    visited[i] = true;
                    sum += cal(i, len-1);
                    visited[i] = false;
                  }
                }
                return sum;
              }
          };

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

          上期推文:

          LeetCode1-340題匯總,希望對(duì)你有點(diǎn)幫助!
          LeetCode刷題實(shí)戰(zhàn)341:扁平化嵌套列表迭代器
          LeetCode刷題實(shí)戰(zhàn)342:4的冪
          LeetCode刷題實(shí)戰(zhàn)343:整數(shù)拆分
          LeetCode刷題實(shí)戰(zhàn)344:反轉(zhuǎn)字符串
          LeetCode刷題實(shí)戰(zhàn)345:反轉(zhuǎn)字符串中的元音字母
          LeetCode刷題實(shí)戰(zhàn)346:數(shù)據(jù)流中的移動(dòng)平均值
          LeetCode刷題實(shí)戰(zhàn)347:前 K 個(gè)高頻元素
          LeetCode刷題實(shí)戰(zhàn)348:設(shè)計(jì)井字棋
          LeetCode刷題實(shí)戰(zhàn)349:兩個(gè)數(shù)組的交集
          LeetCode刷題實(shí)戰(zhàn)350:兩個(gè)數(shù)組的交集 II

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  色婷婷yy | 日韩99| 亚洲黄色视频在线播放 | 色五月丁香五月 | 无码免费一区二区三区免费播放 |