8000 LeetCode/127. Longest Consecutive Sequence at master · MyDataSource/LeetCode · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"allShortcutsEnabled":false,"path":"127. Longest Consecutive Sequence","repo":{"id":189527355,"defaultBranch":"master","name":"LeetCode","ownerLogin":"MyDataSource","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2019-05-31T04:26:14.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/23212692?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1639597980.8342059","canEdit":false,"refType":"branch","currentOid":"1756256d7e619164076bbf358c8f7ca68cd8bd79"},"tree":{"items":[{"name":"README.md","path":"127. Longest Consecutive Sequence/README.md","contentType":"file"},{"name":"TEST.cc","path":"127. Longest Consecutive Sequence/TEST.cc","contentType":"file"},{"name":"solution.h","path":"127. Longest Consecutive Sequence/solution.h","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":{"displayName":"README.md","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e这道题定为 hard 级别的原因并非是解决思路有多难想, 而是难在了效率的瓶颈.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e要求在 O(n) 的复杂度情况下解决. 要知道, 完整的迭代一次就需要 O(n), 这相当于要求在一次迭代过程中, 计算出最大连续序列的长度来.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e比较直接的思路是, 先排个序, 然后完整迭代, 中途记录 max 连击. 这个思路非常简单, 但且不论排序, 那一次完整的迭代就几乎要超标.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这种情况下, 以空间换时间就是最佳的选择. 如果我们在迭代过程中, 尝试记录当前最大的连续序列长度呢? 这几乎是矛盾的, 因为原数组并非有序. 如何可以知道连续序列的存在?\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这让我想到了生活中一个真实的用例: 整理书籍. 学生时代, 每当大考之后, 都会清理书籍, 入库或者变卖. 我们是如何分类清理的呢? 遇到一本书, 看其属于哪一类, 然后放在一个固定的位置. 当全部书籍翻过一遍之后, 就会很自然的出现一堆堆的书堆. 每一堆都是同一类书籍. 我们很清楚的看到哪一类的书籍最多. 最高的那个就是啦.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这里也是一样, 如果我们弄一个 hash 表(key 为数组值, value 为连续序列 size), 将数组里每一个元素都放入表中, 然后发现连续, 则进行 \u003ccode\u003e+1\u003c/code\u003e 操作. 具体来说, 就是:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e若 map[i+1] 和 map[i-1] 存在, 那么 i-1, i, i+1 构成一个三元序列, size == 3;\u003c/li\u003e\n\u003cli\u003e若只有 map[i+1] 或者只有 map[i-1], 那么 size = 2;\u003c/li\u003e\n\u003cli\u003e若 map[i+1] 和 map[i-1] 都不存在, 那么 size = 1; (自己)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e上面三种情况可以写成一个式子:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"map[i] = map[i-1] + map[i+1] + 1; // 左边记录的序列长度 + 右边记录的序列长度 + 自己\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emap[i] = map[i-1] + map[i+1] + 1; // 左边记录的序列长度 + 右边记录的序列长度 + 自己\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e但当 map[i] 的值更新后, 我们还应该将其最新值(长度)扩展至该连续序列的边界上去. 可是如何扩展呢?\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e如 map[i] 的左边最远的连续节点是谁? 右边的最远连续节点是谁? 显然左边可以递推至 map[i-1] 那去, 右边同理. map[i-1] 如果等于1, 表示到它这就断了, 如果等于2, 那么表示它的左边还有一个连续节点.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e那么这个节点的位置也可以用一个式子表示:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"map[i - map[i-1]] // 左边最远节点, 用当前位置 - 左边的长度, 正好获得最左连续节点的坐标.\nmap[i + map[i+1]] // 右边同理.\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emap[i - map[i-1]] // 左边最远节点, 用当前位置 - 左边的长度, 正好获得最左连续节点的坐标.\nmap[i + map[i+1]] // 右边同理.\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e所以当 map[i] 的值更新后, 应推广至最左与最右. 即:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"map[i - map[i-1]] = map[i + map[i+1]] = map[i] = map[i-1] + map[i+1] + 1;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emap[i - map[i-1]] = map[i + map[i+1]] = map[i] = map[i-1] + map[i+1] + 1;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e最后, 由于我们只关心最长连续序列的长度, 所以我们设置一个变量来记录它, 如 max.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"max = std::max(max, map[i]);\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emax = std::max(max, map[i]);\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e综合上述几个式子, 可以归并为一句话:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"max = std::max(max, map[i] = map[i - map[i-1]] = map[i + map[i+1]] = map[i-1] + map[i+1] + 1);\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emax = std::max(max, map[i] = map[i - map[i-1]] = map[i + map[i+1]] = map[i-1] + map[i+1] + 1);\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e这句话即为核心了.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e由于哈希表 unordered_map 默认值为 0. 所以如果遇到一个新值, 则记 map[i] == 1. 如果 map[i] != 0, 显然这个值我们已经存在于 hash 表中, 可以舍弃, 进行下一次迭代.\u003c/p\u003e\n\u003c/article\u003e","errorMessage":null,"headerInfo":{"toc":[],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FMyDataSource%2FLeetCode%2Ftree%2Fmaster%2F127.%2520Longest%2520Consecutive%2520Sequence"}},"totalCount":3,"showBranchInfobar":true},"fileTree":{"":{"items":[{"name":"000. Two Sum","path":"000. Two Sum","contentType":"directory"},{"name":"001. Add Two Numbers","path":"001. Add Two Numbers","contentType":"directory"},{"name":"002. Longest Substring Without Repeating Characters","path":"002. Longest Substring Without Repeating Characters","contentType":"directory"},{"name":"004. Longest Palindromic Substring","path":"004. Longest Palindromic Substring","contentType":"directory"},{"name":"005. ZigZag Conversion","path":"005. ZigZag Conversion","contentType":"directory"},{"name":"006. Reverse Integer","path":"006. Reverse Integer","contentType":"directory"},{"name":"007. Linked List Cycle","path":"007. Linked List Cycle","contentType":"directory"},{"name":"008. Palindrome Number","path":"008. Palindrome Number","contentType":"directory"},{"name":"009. Regular Expression Matching","path":"009. Regular Expression Matching","contentType":"directory"},{"name":"010. Container With Most Water","path":"010. Container With Most Water","contentType":"directory"},{"name":"011. Integer to Roman","path":"011. Integer to Roman","contentType":"directory"},{"name":"012. Roman to Integer","path":"012. Roman to Integer","contentType":"directory"},{"name":"013. Longest Common Prefix","path":"013. Longest Common Prefix","contentType":"directory"},{"name":"015. 3Sum Closest","path":"015. 3Sum Closest","contentType":"directory"},{"name":"016. Letter Combinations of a Phone Number","path":"016. Letter Combinations of a Phone Number","contentType":"directory"},{"name":"017. 4Sum","path":"017. 4Sum","contentType":"directory"},{"name":"018. Remove Nth Node from End of List","path":"018. Remove Nth Node from End of List","contentType":"directory"},{"name":"019. Valid Parentheses","path":"019. Valid Parentheses","contentType":"directory"},{"name":"020. Merge Two Sorted Lists","path":"020. Merge Two Sorted Lists","contentType":"directory"},{"name":"021. Generate Parentheses","path":"021. Generate Parentheses","contentType":"directory"},{"name":"022. Merge k Sorted Lists","path":"022. Merge k Sorted Lists","contentType":"directory"},{"name":"023. Swap Nodes in Pairs","path":"023. Swap Nodes in Pairs","contentType":"directory"},{"name":"024. Reverse Nodes in k-Group","path":"024. Reverse Nodes in k-Group","contentType":"directory"},{"name":"025. Remove Duplicates from Sorted Array","path":"025. Remove Duplicates from Sorted Array","contentType":"directory"},{"name":"026. Remove Element","path":"026. Remove Element","contentType":"directory"},{"name":"027. Implement strStr()","path":"027. Implement strStr()","contentType":"directory"},{"name":"030. Next Permutation","path":"030. Next Permutation","contentType":"directory"},{"name":"032. Search in Rotated Sorted Array","path":"032. Search in Rotated Sorted Array","contentType":"directory"},{"name":"033. Search for a Range","path":"033. Search for a Range","contentType":"directory"},{"name":"034. Search Insert Position","path":"034. Search Insert Position","contentType":"directory"},{"name":"035. Valid Sudoku","path":"035. Valid Sudoku","contentType":"directory"},{"name":"036. Sudoku Solver","path":"036. Sudoku Solver","contentType":"directory"},{"name":"037. Count and Say","path":"037. Count and Say","contentType":"directory"},{"name":"038. Combination Sum","path":"038. Combination Sum","contentType":"directory"},{"name":"039. Combination Sum II","path":"039. Combination Sum II","contentType":"directory"},{"name":"040. First Missing Positive","path":"040. First Missing Positive","contentType":"directory"},{"name":"041. Trapping Rain Water","path":"041. Trapping Rain Water","contentType":"directory"},{"name":"042. Multiply Strings","path":"042. Multiply Strings","contentType":"directory"},{"name":"044. Jump Game II","path":"044. Jump Game II","contentType":"directory"},{"name":"045. Permutations","path":"045. Permutations","contentType":"directory"},{"name":"046. Permutations II","path":"046. Permutations II","contentType":"directory"},{"name":"047. Rotate Image","path":"047. Rotate Image","contentType":"directory"},{"name":"048. Group Anagrams","path":"048. Group Anagrams","contentType":"directory"},{"name":"049. Pow(x, n)","path":"049. Pow(x, n)","contentType":"directory"},{"name":"050. N-Queens","path":"050. N-Queens","contentType":"directory"},{"name":"051. N-Queens II","path":"051. N-Queens II","contentType":"directory"},{"name":"052. Maximum Subarray","path":"052. Maximum Subarray","contentType":"directory"},{"name":"053. Spiral Matrix","path":"053. Spiral Matrix","contentType":"directory"},{"name":"054. Jump Game","path":"054. Jump Game","contentType":"directory"},{"name":"055. Merge Intervals","path":"055. Merge Intervals","contentType":"directory"},{"name":"056. Insert Interval","path":"056. Insert Interval","contentType":"directory"},{"name":"057. Length of Last Word","path":"057. Length of Last Word","contentType":"directory"},{"name":"058. Spiral Matrix II","path":"058. Spiral Matrix II","contentType":"directory"},{"name":"059. Permutation Sequence","path":"059. Permutation Sequence","contentType":"directory"},{"name":"060. Rotate List","path":"060. Rotate List","contentType":"directory"},{"name":"061. Unique Paths","path":"061. Unique Paths","contentType":"directory"},{"name":"062. Unique Paths II","path":"062. Unique Paths II","contentType":"directory"},{"name":"063. Minimum Path Sum","path":"063. Minimum Path Sum","contentType":"directory"},{"name":"065. Plus One","path":"065. Plus One","contentType":"directory"},{"name":"066. Add Binary","path":"066. Add Binary","contentType":"directory"},{"name":"068. Sqrt(x)","path":"068. Sqrt(x)","contentType":"directory"},{"name":"069. Climbing Stairs","path":"069. Climbing Stairs","contentType":"directory"},{"name":"070. Simplify Path","path":"070. Simplify Path","contentType":"directory"},{"name":"071. Edit Distance","path":"071. Edit Distance","contentType":"directory"},{"name":"072. Set Matrix Zeroes","path":"072. Set Matrix Zeroes","contentType":"directory"},{"name":"073. Search a 2D Matrix","path":"073. Search a 2D Matrix","contentType":"directory"},{"name":"074. Sort Colors","path":"074. Sort Colors","contentType":"directory"},{"name":"076. Combinations","path":"076. Combinations","contentType":"directory"},{"name":"077. Subsets","path":"077. Subsets","contentType":"directory"},{"name":"079. Remove Duplicates from Sorted Array II","path":"079. Remove Duplicates from Sorted Array II","contentType":"directory"},{"name":"080. Search in Rotated Sorted Array II","path":"080. Search in Rotated Sorted Array II","contentType":"directory"},{"name":"081. Remove Duplicates from Sorted List II","path":"081. Remove Duplicates from Sorted List II","contentType":"directory"},{"name":"082. Remove Duplicates from Sorted List","path":"082. Remove Duplicates from Sorted List","contentType":"directory"},{"name":"083. Largest Rectangle in Histogram","path":"083. Largest Rectangle in Histogram","contentType":"directory"},{"name":"084. Maximal Rectangle","path":"084. Maximal Rectangle","contentType":"directory"},{"name":"085. Partition List","path":"085. Partition List","contentType":"directory"},{"name":"086. Scramble String","path":"086. Scramble String","contentType":"directory"},{"name":"087. Merge Sorted Array","path":"087. Merge Sorted Array","contentType":"directory"},{"name":"088. Gray Code","path":"088. Gray Code","contentType":"directory"},{"name":"089. Subsets II","path":"089. Subsets II","contentType":"directory"},{"name":"090. Insertion Sort List","path":"090. Insertion Sort List","contentType":"directory"},{"name":"091. Reverse Linked List II","path":"091. Reverse Linked List II","contentType":"directory"},{"name":"092. Restore IP Addresses","path":"092. Restore IP Addresses","contentType":"directory"},{"name":"093. Binary Tree Inorder Traversal","path":"093. Binary Tree Inorder Traversal","contentType":"directory"},{"name":"094. Unique Binary Search Trees II","path":"094. Unique Binary Search Trees II","contentType":"directory"},{"name":"095. Unique Binary Search Trees","path":"095. Unique Binary Search Trees","contentType":"directory"},{"name":"097. Validate Binary Search Tree","path":"097. Validate Binary Search Tree","contentType":"directory"},{"name":"098. Recover Binary Search Tree","path":"098. Recover Binary Search Tree","contentType":"directory"},{"name":"099. Same Tree","path":"099. Same Tree","contentType":"directory"},{"name":"100. Symmetric Tree","path":"100. Symmetric Tree","contentType":"directory"},{"name":"101. Binary Tree Level Order Traversal","path":"101. Binary Tree Level Order Traversal","contentType":"directory"},{"name":"102. Binary Tree Zigzag Level Order Traversal","path":"102. Binary Tree Zigzag Level Order Traversal","contentType":"directory"},{"name":"103. Maximum Depth of Binary Tree","path":"103. Maximum Depth of Binary Tree","contentType":"directory"},{"name":"104. Construct Binary Tree from Preorder and Inorder Traversal","path":"104. Construct Binary Tree from Preorder and Inorder Traversal","contentType":"directory"},{"name":"105. Construct Binary Tree from Inorder and Postorder Traversal","path":"105. Construct Binary Tree from Inorder and Postorder Traversal","contentType":"directory"},{"name":"106. Binary Tree Level Order Traversal II","path":"106. Binary Tree Level Order Traversal II","contentType":"directory"},{"name":"107. Convert Sorted Array to Binary Search Tree","path":"107. Convert Sorted Array to Binary Search Tree","contentType":"directory"},{"name":"108. Convert Sorted List to Binary Search Tree","path":"108. Convert Sorted List to Binary Search Tree","contentType":"directory"},{"name":"109. Balanced Binary Tree","path":"109. Balanced Binary Tree","contentType":"directory"},{"name":"110. Minimum Depth of Binary Tree","path":"110. Minimum Depth of Binary Tree","contentType":"directory"},{"name":"111. Path Sum","path":"111. Path Sum","contentType":"directory"},{"name":"112. Path Sum II","path":"112. Path Sum II","contentType":"directory"},{"name":"113. Flatten Binary Tree to Linked List","path":"113. Flatten Binary Tree to Linked List","contentType":"directory"},{"name":"114. Distinct Subsequences","path":"114. Distinct Subsequences","contentType":"directory"},{"name":"115. Populating Next Right Pointers in Each Node","path":"115. Populating Next Right Pointers in Each Node","contentType":"directory"},{"name":"116. Populating Next Right Pointers in Each Node II","path":"116. Populating Next Right Pointers in Each Node II","contentType":"directory"},{"name":"117. Pascal's Triangle","path":"117. Pascal's Triangle","contentType":"directory"},{"name":"118. Pascal's Triangle II","path":"118. Pascal's Triangle II","contentType":"directory"},{"name":"119. Triangle","path":"119. Triangle","contentType":"directory"},{"name":"120. Best Time to Buy and Sell Stock","path":"120. Best Time to Buy and Sell Stock","contentType":"directory"},{"name":"121. Best Time to Buy and Sell Stock II","path":"121. Best Time to Buy and Sell Stock II","contentType":"directory"},{"name":"122. Best Time to Buy and Sell Stock III","path":"122. Best Time to Buy and Sell Stock III","contentType":"directory"},{"name":"122. Sort List","path":"122. Sort List","contentType":"directory"},{"name":"123. Binary Tree Maximum Path Sum","path":"123. Binary Tree Maximum Path Sum","contentType":"directory"},{"name":"124. Valid Palindrome","path":"124. Valid Palindrome","contentType":"directory"},{"name":"125. Reorder List","path":"125. Reorder List","contentType":"directory"},{"name":"127. Longest Consecutive Sequence","path":"127. Longest Consecutive Sequence","contentType":"directory"},{"name":"128. Sum Root to Leaf Numbers","path":"128. Sum Root to Leaf Numbers","contentType":"directory"},{"name":"130. Palindrome Partitioning","path":"130. Palindrome Partitioning","contentType":"directory"},{"name":"132. Clone Graph","path":"132. Clone Graph","contentType":"directory"},{"name":"133. Gas Station","path":"133. Gas Station","contentType":"directory"},{"name":"135. Single Number","path":"135. Single Number","contentType":"directory"},{"name":"136. Single Number II","path":"136. Single Number II","contentType":"directory"},{"name":"137. Copy List with Random Pointer","path":"137. Copy List with Random Pointer","contentType":"directory"},{"name":"138. Word Break","path":"138. Word Break","contentType":"directory"},{"name":"141. Linked List Cycle II","path":"141. Linked List Cycle II","contentType":"directory"},{"name":"143. Binary Tree Preorder Traversal","path":"143. Binary Tree Preorder Traversal","contentType":"directory"},{"name":"144. Binary Tree Postorder Traversal","path":"144. Binary Tree Postorder Traversal","contentType":"directory"},{"name":"152. Find Minimum in Rotated Sorted Array","path":"152. Find Minimum in Rotated Sorted Array","contentType":"directory"},{"name":"435. Find All Duplicates in an Array","path":"435. Find All Duplicates in an Array","contentType":"directory"},{"name":"619. Maximum Average Subarray I","path":"619. Maximum Average Subarray I","contentType":"directory"},{"name":"630. Maximum Binary Tree","path":"630. Maximum Binary Tree","contentType":"directory"},{"name":"Catch","path":"Catch","contentType":"submodule","submoduleUrl":"/catchorg/Catch2/tree/d4e5f184369ce34592bb6f89e793bdb22d1d011a","submoduleDisplayName":"Catch @ d4e5f18"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitmodules","path":".gitmodules","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"totalCount":137}},"fileTreeProcessingTime":7.76559,"foldersToFetch":[],"treeExpanded":true,"symbolsExpanded":false,"csrf_tokens":{"/MyDataSource/LeetCode/branches":{"post":"IR9xm5CLiK3L1rUUSsD2zP9SAyyQ01bFBQTi-pLNlxztFpHYa0gVKu2XWgALz-IX-sThanVV3cuxUW2Iq8CyHg"},"/MyDataSource/LeetCode/branches/fetch_and_merge/master":{"post":"Y5tW0ybJZya3gsyXZKXiB7kQJso2Q6RUg6DRzG9wQC2abeNm_crB1KXgk4iUvJpQbDlbrW6kGSgVVXlediSQnw"},"/MyDataSource/LeetCode/branches/fetch_and_merge/master?discard_changes=true":{"post":"-MQcKv1D2nAyAhrS1XG0n7EUlBU8QBKasd_yZLQ3uWMBMqmfJkB8giBgRc0laMzIZD3pcmSnr-YnKlr2rWNp0Q"}}},"title":"LeetCode/127. Longest Consecutive Sequence at master · MyDataSource/LeetCode","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1b17b3e7786a.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0