Leetcode題解 Gray Code

2021-03-02 程式設計師大白

點擊上方「程式設計師大白」,選擇「星標」公眾號

重磅乾貨,第一時間送達

題目分析:

給出數字N,要求生成位數不大於N的格雷碼序列。  

格雷碼:在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進位數不同,則稱這種編碼為格雷碼(Gray Code)

解題思路:  

簡單的模擬生成題,由于格雷碼要求相鄰的數字有且僅有一位不同,先考慮如果當前已經有不大於N-1位的合法格雷碼序列  如現在已經有不大於2位的合法格雷碼序列——000、001、011、010    

最簡單直接的方式便是將上述序列複製一遍,將其第N位全置為1。則在上述所得到的副本內部,彼此之前滿足相鄰數字有且僅有一位不同的要求。而後考慮將副本與原先的進行拼接,發現副本最尾端的是由原序列最尾端的數字派生出來。因此,將副本翻轉順序後和原序列拼接即可獲得不大於N的合法格雷碼序列。  算法過程如下:

初始化序列,將0加入其中,i=1。

生成不大於i位的序列,從原序列尾端往前依次取出一數字x,令y = x | (1<<i);,後將y加入答案序列之中。

i = i+1,若i>N則結束,否則回到過程2。  

整體而言,生成每個格雷碼僅需要一次運算,因此時間複雜度為O(2^N).

CPP代碼

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ans;
        ans.push_back(0);
        if(n==0) return ans;
        ans.push_back(1);
        int down=1;
        for(int T=1; T<n; T++)
        {
            for(int i=down; i!= -1; i--)
            {
                int x = ans[i] | (1<<T);//產生新的數字
                ans.push_back(x);
            }
                down = ans.size();//重新確定當前的下界
        }
        return ans;
    }
};

重磅!程式設計師大白交流群-學術微信交流群已成立

額外贈送福利資源!邱錫鵬深度學習與神經網絡,pytorch官方中文教程,利用Python進行數據分析,機器學習學習筆記,pandas官方文檔中文版,effective java(中文版)等20項福利資源

獲取方式:進入群後點開群公告即可領取下載連結

昨晚拉人小助手出了問題,最近不能使用,請大家加入微信2群

注意:請大家添加時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

推薦閱讀

Leetcode題解 SimplifyPath

Leetcode題解 InsertInterval

Leetcode題解 MergeIntervals

Leetcode題解 JumpGame

Leetcode題解 N-Queens

Leetcode題解 Trapping Rain Water

關於程式設計師大白

程式設計師大白是一群哈工大,東北大學,西湖大學和上海交通大學的碩士博士運營維護的號,大家樂於分享高質量文章,喜歡總結知識,歡迎關注[程式設計師大白],大家一起學習進步!

相關焦點

  • Leetcode題解 WordBreak
    舉個例子,給定  s = "leetcode",dict = ["leet", "code"].上述將返回true,因為"leetcode"可以分割成"leet code".題解算法及複雜度(6 ms)  本問題是確定一個字符串是否能分割成多個單詞,這些單詞都在字典中出現.
  • Leecode題解 CombinationSum
    舉個例子:數字集合: [2, 3, 6, 7]目標值: 7結果: [     [7],     [2, 2, 3]]題解算法正確性  從兩方面說明算法正確性:是否能找到所有符合條件的組合:  完整的回溯算法是可以找到所有的組合(搜索整個解空間
  • Leecode題解 :7. Reverse Integer
    題目分析題目意思,要求反轉一個數字,如果反轉後超過32位表示,則輸出0解題思路(1)這道題非常簡單            x/=10;        }        if(s>INT_MAX || s<INT_MIN)            return 0;        else            return s;    }};推薦閱讀Leecode
  • ​LeetCode刷題實戰139:單詞拆分
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 單詞拆分,我們先來看題面:https://leetcode-cn.com/problems/word-break/Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be
  • 回溯法|一文解決四道 Leetcode「組合總和」題
    解集不能包含重複的組合。解集不能包含重複的組合。 組合總和」 和 「leetcode-40.1.2 題目分析當我們遇到:「可行解是什麼、可行解有多少個」這類問題時,最樸素的想法就是「枚舉」,枚舉出所有可能的結果,並在枚舉的過程中不斷刪除不符合條件的解。
  • leetcode刷題指南之PalindromePairs
    則(0, 1)為一解;對於"bat", 我們發現map["tab"] = 0,且末尾串""為回文串。則(1, 0)為一解。故答案為[[0, 1], [1, 0]]。= i)25                    ans.push_back({ma[r], i});26            }27        }28        return ans;29    }30};作者:東大ACM退役隊伍編輯:劉凱旋推薦閱讀:leetcode刷題指南之
  • Leetcode題解 ScrambleString
    推薦閱讀Leetcode題解 MaximalRectangleLeetcode題解 Word_SearchLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Leetcode題解 DecodeWays
    題解算法及複雜度(0 ms)  本題和爬梯子(第70題)那個題有點像,仔細考慮一下看看是不是這樣.推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • Leecode題解 :4.Median of Two Sorted Arrays
    題解算法及複雜度(35 ms)  這個問題歸結為為查找兩個數組合併後的第 k 小元素.getK(nums1, nums2, (m + n + 2) / 2)) / 2.0;        } else {            return getK(nums1, nums2, (m + n + 1) / 2) * 1.0;        }    }};推薦閱讀Leecode
  • codeforces 202011 月賽
    零、背景上周日,上午我沒吃早飯參加了 10:30 ~ 12:00 的 leetcode 周賽,下午又沒吃午飯參加了 12:00 ~ 17:00 codeforces 的 202011 月賽。晚上 19:00 的牛客練習賽實在是做不動了,遂放棄。這次 codeforces 的月賽相當殘暴,出了 13 道題。
  • Leetcode題解 HouseRobber
    題意題解算法及複雜度(Run Time 0ms)這個一個求最優解的問題因為動態規劃常用來求最優解。先假定這個問題可以用動態規划進行求解,找最優子結構,假定求前n+1(n >= 2 )個房屋盜賊能偷到的最多的錢為dp[n]。由於每個房屋的錢都是非負的,所以前n+1個房屋的總的可以偷的錢,要麼與前n個房屋偷的錢相等,要麼等於前n-1個房屋可以偷的錢,加上第n+1個房屋的錢數,除了這兩種情況外,沒有其他情況。
  • LeetCode-53. Maximum Subarray | 最大子序和
    題解難度為簡單。temp = temp + nums[i] } else { temp = nums[i] } if temp > max { max = temp } } return max //返回最大值}執行結果:leetcode-cn
  • Leetcode題解 Rotate Array
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-Queens
  • 用這種解題方法,我解決了大部分的 leetcode 貪心算法題
    第一題,leetcode中等難度題目先來一道簡單的字典序排列的問題,這個題目我這裡不會用最優解來解決這個問題,這個是leetcode的中等難度的題目,最優解還是需要再思考一下的,這道題目作為文章開頭只是為了介紹我想要介紹的貪心的解題的一種思路而已,大佬請勿噴!!
  • Leetcode題解 Course Schedule
    只要該拓撲圖能夠存在一合法的拓撲解,則所有課程能夠順利修習完成。入度為0節點,若當前無法找到且圖中還有未被刪除的節點,則說明當前圖能存在環,無解;拓展從該節點出發的有向邊能到達的另一節點,將其入度剪一;從圖中刪除該節點,若刪除的節點數目已達到N則表示所有節點均已輸出,存在一個合法解;
  • Leetcode題解 Word_Search
    visited[i][j]=0;                           //一定要保證的是使他變回來        //return false;                  }    bool exist(vector<vector<char>>& board, string word) {        // 此題用搜索
  • Leetcode題解 Edit Distance
    推薦閱讀Leetcode題解 SimplifyPathLeetcode題解 InsertIntervalLeetcode題解 MergeIntervalsLeetcode題解 JumpGameLeetcode題解 N-QueensLeetcode題解 Trapping Rain Water關於程式設計師大白
  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    介紹leetcode 題解,記錄自己的 leetcode 解題之路。目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第二部分是對於數據結構與算法的總結第三部分是 anki 卡片, 將 leetcode 題目按照一定的方式記錄在 anki 中,方便大家記憶。
  • LeetCode 刷題指南(1):為什麼要刷題
    ,不過不可否認刷題確實能鍛鍊我們的編程能力,相信每個認真刷題的人都會有體會。類似的題目也許有類似的結構,類似的性質,類似的解方案。通過考察或回憶一個類似的題目是如何解決的,也許就能夠借用一些重要的點子(比較 Ugly Number 的三個題目:263. Ugly Number, 264. Ugly Number II, 313. Super Ugly Number)。用特例啟發思考。通過考慮一個合適的特例,可以方便我們快速尋找出一般問題的解。
  • Leetcode刷題五遍還沒offer!舉例分析為什麼找工作光刷題不夠
    一畝三分地就業求職版裡,有位同學發帖說:LZ從14年秋季入學開始刷題,一門心思要找份好工作,到現在leetcode已經刷過五遍,都做好詳盡的總結,看過geeksforgeeks裡面一半的topic。。。今年形勢不行,上學期只拿到了微軟,google, tableau和bloomberg的面試。