{"componentChunkName":"component---src-lekoarts-gatsby-theme-minimal-blog-core-templates-post-query-tsx","path":"/longest-increasing-subsequence-and-patience-game-part-2","result":{"data":{"post":{"slug":"/longest-increasing-subsequence-and-patience-game-part-2","title":"Longest Increasing Subsequence And Patience Game(Part2)","date":"April 05, 2020","tags":[{"name":"Algorithm","slug":"algorithm"}],"description":null,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2020-04-05T00:00:00.000Z\",\n  \"title\": \"Longest Increasing Subsequence And Patience Game(Part2)\",\n  \"tags\": [\"Algorithm\"],\n  \"excerpt\": \"Implementation of the O(nlogn) solution\"\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This part covers the actual implementation of the idea mentioned in \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sixian.li/longest-increasing-subsequence-and-patience-game-part-1\"\n  }), \"Part1\"), \". I assume you\\u2019ve read it, and I\\u2019ll use claims proved in that part.\"), mdx(\"p\", null, \"If you understand how the greedy algorithm works for Patience, the implementation is just simulationg the gameplay.\"), mdx(\"h3\", null, \"Goal\"), mdx(\"p\", null, \"Remember, the algorithm puts the new card on the leftmost pile possible, and the length of the LIS is the total number of piles at the end of the game.\"), mdx(\"p\", null, \"So the problem boils down to find out \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"mathvariant\": \"normal\"\n  }), \"#\"), mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"piles\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"\\\\#\\\\text{piles}\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.8888799999999999em\",\n      \"verticalAlign\": \"-0.19444em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"#\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"piles\"))))), \".\"), mdx(\"h3\", null, \"Let\\u2019s play the game\"), mdx(\"h4\", null, \"1. Do we need to store every card in a pile?\"), mdx(\"p\", null, \"When we\\u2019re looking for a valid pile, we only compare the new card \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"c\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"c\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.43056em\",\n      \"verticalAlign\": \"0em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"c\")))), \" and the top card \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"t\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"t\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.61508em\",\n      \"verticalAlign\": \"0em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"t\")))), \" of a pile. If \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"c\"), mdx(\"mo\", {\n    parentName: \"mrow\"\n  }, \"\\u2264\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"t\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"c \\\\leq t\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.7719400000000001em\",\n      \"verticalAlign\": \"-0.13597em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"c\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mrel\"\n  }), \"\\u2264\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  }))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.61508em\",\n      \"verticalAlign\": \"0em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"t\")))), \", we put \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"c\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"c\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.43056em\",\n      \"verticalAlign\": \"0em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"c\")))), \" on the pile, and it becomes the new top card. So there\\u2019s no need to store every card.\"), mdx(\"h4\", null, \"2. How do we find the first valid pile?\"), mdx(\"p\", null, \"Of course, we can look at every pile from left to right, that would be \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"O\"), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \"(\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"n\"), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \")\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"O(n)\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"1em\",\n      \"verticalAlign\": \"-0.25em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.02778em\"\n    }\n  }), \"O\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mopen\"\n  }), \"(\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"n\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mclose\"\n  }), \")\")))), \", and the total complexity will be \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"O\"), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \"(\"), mdx(\"msup\", {\n    parentName: \"mrow\"\n  }, mdx(\"mi\", {\n    parentName: \"msup\"\n  }, \"n\"), mdx(\"mn\", {\n    parentName: \"msup\"\n  }, \"2\")), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \")\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"O(n^2)\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"1.064108em\",\n      \"verticalAlign\": \"-0.25em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.02778em\"\n    }\n  }), \"O\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mopen\"\n  }), \"(\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"n\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"msupsub\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"vlist-t\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"vlist-r\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"vlist\",\n    \"style\": {\n      \"height\": \"0.8141079999999999em\"\n    }\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"style\": {\n      \"top\": \"-3.063em\",\n      \"marginRight\": \"0.05em\"\n    }\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"pstrut\",\n    \"style\": {\n      \"height\": \"2.7em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"sizing reset-size6 size3 mtight\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mtight\"\n  }), \"2\")))))))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mclose\"\n  }), \")\")))), \". There\\u2019s an extra piece of information about those top cards: they form an increasing subsequence, i.e., they\\u2019re sorted.\"), mdx(\"p\", null, \"How do we define \\u201Cleftmost\\u201D? It is the first pile such that \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"new\\xA0card\"), mdx(\"mo\", {\n    parentName: \"mrow\"\n  }, \"\\u2264\"), mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"top\\xA0card\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"\\\\text{new card} \\\\leq \\\\text{top card}\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.83041em\",\n      \"verticalAlign\": \"-0.13597em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"new\\xA0card\")), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mrel\"\n  }), \"\\u2264\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  }))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.8888799999999999em\",\n      \"verticalAlign\": \"-0.19444em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"top\\xA0card\"))))), \", so we have \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"new\\xA0card\"), mdx(\"mo\", {\n    parentName: \"mrow\"\n  }, \">\"), mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"top\\xA0card\\xA0of\\xA0the\\xA0last\\xA0pile\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"\\\\text{new card} \\\\gt \\\\text{top card of the last pile}\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.73354em\",\n      \"verticalAlign\": \"-0.0391em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"new\\xA0card\")), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mrel\"\n  }), \">\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  }))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.8888799999999999em\",\n      \"verticalAlign\": \"-0.19444em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"top\\xA0card\\xA0of\\xA0the\\xA0last\\xA0pile\"))))), \".\"), mdx(\"p\", null, \"If \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"new\\xA0card\"), mdx(\"mo\", {\n    parentName: \"mrow\"\n  }, \">\"), mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"some\\xA0top\\xA0card\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"\\\\text{new card} \\\\gt \\\\text{some top card}\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.73354em\",\n      \"verticalAlign\": \"-0.0391em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"new\\xA0card\")), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mrel\"\n  }), \">\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mspace\",\n    \"style\": {\n      \"marginRight\": \"0.2777777777777778em\"\n    }\n  }))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.8888799999999999em\",\n      \"verticalAlign\": \"-0.19444em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"some\\xA0top\\xA0card\"))))), \", \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mtext\", {\n    parentName: \"mrow\"\n  }, \"new\\xA0card\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"\\\\text{new card}\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.69444em\",\n      \"verticalAlign\": \"0em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord text\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord\"\n  }), \"new\\xA0card\"))))), \" is larger than anything to the left of that pile, so we can skip those elements. Yes, that\\u2019s binary search, the \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"l\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"o\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"g\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"n\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"logn\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"0.8888799999999999em\",\n      \"verticalAlign\": \"-0.19444em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.01968em\"\n    }\n  }), \"l\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"o\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.03588em\"\n    }\n  }), \"g\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"n\")))), \" part in \", mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"katex\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-mathml\"\n  }), mdx(\"math\", _extends({\n    parentName: \"span\"\n  }, {\n    \"xmlns\": \"http://www.w3.org/1998/Math/MathML\"\n  }), mdx(\"semantics\", {\n    parentName: \"math\"\n  }, mdx(\"mrow\", {\n    parentName: \"semantics\"\n  }, mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"O\"), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \"(\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"n\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"l\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"o\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"g\"), mdx(\"mi\", {\n    parentName: \"mrow\"\n  }, \"n\"), mdx(\"mo\", _extends({\n    parentName: \"mrow\"\n  }, {\n    \"stretchy\": \"false\"\n  }), \")\")), mdx(\"annotation\", _extends({\n    parentName: \"semantics\"\n  }, {\n    \"encoding\": \"application/x-tex\"\n  }), \"O(nlogn)\")))), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"katex-html\",\n    \"aria-hidden\": \"true\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"base\"\n  }), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"strut\",\n    \"style\": {\n      \"height\": \"1em\",\n      \"verticalAlign\": \"-0.25em\"\n    }\n  })), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.02778em\"\n    }\n  }), \"O\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mopen\"\n  }), \"(\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"n\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.01968em\"\n    }\n  }), \"l\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"o\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\",\n    \"style\": {\n      \"marginRight\": \"0.03588em\"\n    }\n  }), \"g\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mord mathdefault\"\n  }), \"n\"), mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"mclose\"\n  }), \")\")))), \".\"), mdx(\"h3\", null, \"Code\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-python\",\n    \"metastring\": \"{6,10-11,13,15-16}\",\n    \"{6,10-11,13,15-16}\": true\n  }), \"def LIS(nums):\\n\\n    piles = []\\n\\n    for n in nums:\\n        left, right = 0, len(piles)\\n\\n        while left < right:\\n            mid = left + (right - left) // 2\\n            if piles[mid] < n:\\n                left = mid + 1\\n            else:\\n                right = mid\\n\\n        if left == len(piles):\\n            piles.append(n)\\n        else:\\n            piles[left] = n\\n\\n    return len(piles)\\n\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Line 6:\"), \" \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"right\"), \" is \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"len(piles)\"), \" instead of the usual \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"len(piles) - 1\"), \" because \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"n\"), \" can be larger than any top card in current piles, then it should be placed in a new pile.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Line 10-11:\"), \" If \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"piles[mid] < n\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"mid\"), \" is definitely not the pile where \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"n\"), \" is placed, so we can exclude it.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Line 13:\"), \" In this branch, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"n <= piles[mid]\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"mid\"), \" may be the pile we\\u2019re looking for, so we can\\u2019t exclude it. But we\\u2019re not sure if it\\u2019s the leftmost position, so we keep going.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Line 15-16:\"), \" If the leftmost valid pile doesn\\u2019t exist yet, it means \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"n\"), \" is larger than all top cards, so we create a new pile for it, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"len(piles)\"), \" will be incremented by 1 at the same time.\"), mdx(\"hr\", null), mdx(\"p\", null, \"That\\u2019s all for this algorithm. Knowing why an algorithm works is always more important than memorizing the implementation. Proving its correctness is a very good way to learn.\"));\n}\n;\nMDXContent.isMDXComponent = true;","excerpt":"Implementation of the O(nlogn) solution","banner":null}},"pageContext":{"slug":"/longest-increasing-subsequence-and-patience-game-part-2"}}}