<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gabriel Pereira</title>
    <description>The latest articles on Forem by Gabriel Pereira (@painkiller54).</description>
    <link>https://forem.com/painkiller54</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1291476%2Fa485693e-ba66-4ee2-9c03-36f589087229.png</url>
      <title>Forem: Gabriel Pereira</title>
      <link>https://forem.com/painkiller54</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/painkiller54"/>
    <language>en</language>
    <item>
      <title>Leetcode 1472 - Design Browser History</title>
      <dc:creator>Gabriel Pereira</dc:creator>
      <pubDate>Thu, 22 Feb 2024 01:50:22 +0000</pubDate>
      <link>https://forem.com/painkiller54/leetcode-1472-design-browser-history-5cdh</link>
      <guid>https://forem.com/painkiller54/leetcode-1472-design-browser-history-5cdh</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcroy8mpess9eyylcrir5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcroy8mpess9eyylcrir5.png" alt="Image description" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyc0rnf5qgjn9obrrqbqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyc0rnf5qgjn9obrrqbqw.png" alt="Image description" width="563" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O desafio envolve "implementar" um historico de navegacao onde temos 3 operacoes: visit, back e forward, sendo bem simples e direto, as operacoes back e forward avancam/retornam no historico, a operacao visit deve acessar uma nova pagina a partir da posicao atual, limpando o historico de acesso posterior.&lt;/p&gt;

&lt;p&gt;Ex:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 - input inicial, instanciando a classe com uma url:&lt;/strong&gt;&lt;br&gt;
   &lt;code&gt;BrowserHistory("www.google.com")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 - visit&lt;/strong&gt;&lt;br&gt;
   &lt;code&gt;BrowserHistory.visit("www.facebook.com")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 - visit&lt;/strong&gt;&lt;br&gt;
   &lt;code&gt;BrowserHistory.visit("www.linkedin.com")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw77ol2my511ojzkoz2jq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw77ol2my511ojzkoz2jq.png" alt="Image description" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 - back 2 steps&lt;/strong&gt;&lt;br&gt;
  &lt;code&gt;BrowserHistory.back(2)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foweory8otnbi0ok53zr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foweory8otnbi0ok53zr9.png" alt="Image description" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 - forward 1 step&lt;/strong&gt;&lt;br&gt;
  &lt;code&gt;BrowserHistory.forward(1)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3isjgbfs59ncc5jg245.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3isjgbfs59ncc5jg245.png" alt="Image description" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 - visit &lt;a href="http://www.youtube.com"&gt;www.youtube.com&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
   &lt;code&gt;BrowserHistory.visit("www.youtube.com")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz52lwxgqq95jlww11g7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz52lwxgqq95jlww11g7s.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approach 1 - Usando doubly singled list (menos performático)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3ajwvnfm8skpmuzlav3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3ajwvnfm8skpmuzlav3.png" alt="Image description" width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;usando essa estrutura, cada no da lista ligada armazena o endereco do proximo/anterior&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2o8l8ahc7n6rqhfpl6nt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2o8l8ahc7n6rqhfpl6nt.png" alt="Image description" width="526" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sendo mais custoso por ter que percorrer um loop toda vez que usar as operacoes back/forward, complexidade de tempo e espaco O(n) onde n é o número de steps&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approach 2 - usando um array e um pointer para salvar as posicoes (mais performatico)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzr8tifokbzbodiqnkuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzr8tifokbzbodiqnkuf.png" alt="Image description" width="798" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como nao é necessário percorrer o array nas operações de back/forward, a complexidade de tempo é O(1) e a complexidade de espaço é O(n) onde n é o numero de urls visitadas usando o método visit()&lt;/p&gt;

</description>
      <category>leetcode</category>
      <category>python</category>
    </item>
  </channel>
</rss>
