<?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>DEV Community: goosamsf</title>
    <description>The latest articles on DEV Community by goosamsf (@goosamsf_8).</description>
    <link>https://dev.to/goosamsf_8</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%2F1238990%2Fb12bcd84-544d-4cba-ba62-5fa9d61329e2.png</url>
      <title>DEV Community: goosamsf</title>
      <link>https://dev.to/goosamsf_8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/goosamsf_8"/>
    <language>en</language>
    <item>
      <title>LeetCode Problem : Palindrome Number</title>
      <dc:creator>goosamsf</dc:creator>
      <pubDate>Thu, 28 Dec 2023 17:25:13 +0000</pubDate>
      <link>https://dev.to/goosamsf_8/leetcode-problem-palindrome-number-48l2</link>
      <guid>https://dev.to/goosamsf_8/leetcode-problem-palindrome-number-48l2</guid>
      <description>&lt;h3&gt;
  
  
  Problem Statement
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Given an integer &lt;code&gt;x&lt;/code&gt;, return true if x is a&lt;br&gt;
palindrome, and false otherwise.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Intuition
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;How to revert integer number? How to approach this problem without even converting into string? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Approach
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;integer 121 for example,&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;121 / 10 &lt;span class="o"&gt;=&lt;/span&gt; 12
121 % 10 &lt;span class="o"&gt;=&lt;/span&gt; 1 , &lt;span class="nb"&gt;let &lt;/span&gt;this be &lt;span class="s1"&gt;'a'&lt;/span&gt; 

12 / 10 &lt;span class="o"&gt;=&lt;/span&gt; 1
12 % 10 &lt;span class="o"&gt;=&lt;/span&gt; 2 , &lt;span class="nb"&gt;let &lt;/span&gt;this be &lt;span class="s1"&gt;'b'&lt;/span&gt; 

1 / 10 &lt;span class="o"&gt;=&lt;/span&gt; 0
1 % 10 &lt;span class="o"&gt;=&lt;/span&gt; 1 , &lt;span class="nb"&gt;let &lt;/span&gt;this be &lt;span class="s1"&gt;'c'&lt;/span&gt;

reverted number is &lt;span class="o"&gt;(((&lt;/span&gt;a&lt;span class="k"&gt;*&lt;/span&gt;10&lt;span class="o"&gt;)&lt;/span&gt; + b&lt;span class="o"&gt;)&lt;/span&gt;10 + c&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;But here we want to revert only half because the range of the given input number is between -2^31 and 2^31. That is 2147483648 and if we try to revert this number entirely, int type can not even hold this value since the least significant digit is greater than the most significant digit. Therefore what we want to do is to revert only half of it. We can do this by making sure building-reverted number is less than the original number repeatly being divided by 10. For example, consider integer 1234, there will be comparison 4 vs 123 than 12 vs 43 and this is the exact condition we want to stop.&lt;/p&gt;

&lt;p&gt;When the length of input is odd, we can simply do comparison between building-reverted number divided by 10 is equal to the original 'getting-smaller' number.&lt;/p&gt;

&lt;p&gt;Lastly we want to handle following edge cases.&lt;br&gt;
    - Negative number -&amp;gt; always not palindrome&lt;br&gt;
    - 0 -&amp;gt; always palindrome &lt;br&gt;
    - number multiple of 10 -&amp;gt; always not palindrome&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Time Complexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O(log10 N) : Every iteration we divide the number by 10 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rev&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rev&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rev&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;rev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Can We Do Better?
&lt;/h3&gt;

&lt;p&gt;No, O(logN) is already good enough&lt;/p&gt;

&lt;h3&gt;
  
  
  Seed For Interview
&lt;/h3&gt;

&lt;p&gt;Revert half of the number and be careful about few edge cases.&lt;/p&gt;

</description>
      <category>math</category>
    </item>
    <item>
      <title>LeetCode Problem : Jump Game</title>
      <dc:creator>goosamsf</dc:creator>
      <pubDate>Sun, 24 Dec 2023 19:09:20 +0000</pubDate>
      <link>https://dev.to/goosamsf_8/leetcode-problem-jump-game-3j58</link>
      <guid>https://dev.to/goosamsf_8/leetcode-problem-jump-game-3j58</guid>
      <description>&lt;h3&gt;
  
  
  LeetCode Problem : Jump Game
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Problem Statement
&lt;/h4&gt;

&lt;p&gt;You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position.&lt;/p&gt;

&lt;p&gt;Return true if you can reach the last index, or false otherwise.&lt;/p&gt;

&lt;h4&gt;
  
  
  Overview
&lt;/h4&gt;

&lt;p&gt;Dynamic Programming can be used by iterating over array and check if the current index is reachable. However even with dynamic programming, it's still O(N^2). How to optimize this to O(N) where we only pass an array once : Greedy&lt;/p&gt;

&lt;h4&gt;
  
  
  Intuition
&lt;/h4&gt;

&lt;p&gt;An index is reachable if you can jump from some of previous reachable index.&lt;/p&gt;

&lt;h4&gt;
  
  
  Approach
&lt;/h4&gt;

&lt;p&gt;Construct boolean array &lt;code&gt;reachable&lt;/code&gt;. Iterate over &lt;code&gt;nums&lt;/code&gt;. for each index &lt;code&gt;i&lt;/code&gt; check if ith index is reachable from any of reachable indices. We do this by checking all indices that marked as reachable from previous iteration. if reachable, set &lt;code&gt;reachable[i]&lt;/code&gt; to true. Keep going upto last index and if last index of &lt;code&gt;reachable&lt;/code&gt; true, return true, false otherwise.&lt;/p&gt;

&lt;h5&gt;
  
  
  Can we do better?
&lt;/h5&gt;

&lt;p&gt;Think of you standing at the position and see which position is the furthest position you can jump to. Keep tracking of this information and do this at each position and at any index if the current index is bigger than position that you can jump furthest, return false. otherwise return true.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//Dynamic Programming : O(N^2)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;canJump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;//declare slice    &lt;/span&gt;
  &lt;span class="n"&gt;reachable&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;reachable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reachable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;reahcable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
          &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;myslice&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;canJump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;furthest&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;furthest&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;far&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;far&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Seed for Interview
&lt;/h4&gt;

&lt;p&gt;Greedy : for each index i, if &lt;code&gt;i&lt;/code&gt; is greater than &lt;code&gt;furthest&lt;/code&gt; return false. Than compute &lt;code&gt;furthest&lt;/code&gt; from &lt;code&gt;i&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>array</category>
      <category>dp</category>
      <category>greedy</category>
    </item>
  </channel>
</rss>
