First Missing Positive - Leetcode 41 - Python

Поділитися
Вставка
  • Опубліковано 2 лют 2025

КОМЕНТАРІ • 184

  • @ygwg6145
    @ygwg6145 Рік тому +63

    In the first round, setting all values less than zero and greater than N with the default value N+1 simplifies the coding a lot.

    • @Ford-ju9yr
      @Ford-ju9yr 9 місяців тому

      Why not 0? n+1 can be too much to store in case where n=maxInteger

    • @VeetCoder
      @VeetCoder 6 місяців тому

      @@Ford-ju9yr bruh, he using n + 1 anyways line 14

    • @aceofspades-s5o
      @aceofspades-s5o 5 місяців тому +1

      @@Ford-ju9yr 0 results in the edge case where we can't mark it as negative, we reduce some work by setting it to be an out of bounds positive number instead

    • @kane-m9o
      @kane-m9o 2 місяці тому +1

      hey guys, tell me one thingg while we checking the nums[i] , we dont even check the neg number ryt and wt is the use of tit then making it as zeroo, i think have a point but , i need ur's too

  • @touwmer
    @touwmer 2 роки тому +26

    Man, this is 1000 times better than the official solution from leetcode Premium.

  • @ZQutui
    @ZQutui 3 роки тому +36

    Thanks for the content. It's the best channel with algorithm explanations. It is explained so clear

  • @paularah2664
    @paularah2664 2 роки тому +24

    I paused and solved this problem about 4 mins into the video. You have an amazing way of opening one's eyes to insights. Thanks for sharing your knowledge.

    • @kane-m9o
      @kane-m9o 2 місяці тому

      yeahh, u r absolutley rytt!!!

  • @igboman2860
    @igboman2860 3 роки тому +107

    Do people figure these things out by intuition or by studying?

    • @jeffkirchoff14
      @jeffkirchoff14 2 роки тому +24

      By Cyclic Sort

    • @surendharv795
      @surendharv795 2 роки тому

      ua-cam.com/video/Znos3MyLOQI/v-deo.html
      @Igbo Man Refer this....

    • @soumyadeepdas1536
      @soumyadeepdas1536 2 роки тому +21

      The 3rd approach can't be intuitive i believe, you gotta know it at first. The best I came up with was sorting and hashing

    • @learningwithcharan
      @learningwithcharan 2 роки тому +5

      I am also having this doubt when I am able to see this kind of solution

    • @AffairWithGeo
      @AffairWithGeo Рік тому

      ​@@soumyadeepdas1536😅😅 me too

  • @frida8519
    @frida8519 Рік тому +8

    Dude, I couldn't do this hard question before, so I practiced a lot of the other medium questions and watched your videos. Then, I came back to this problem, and ended up figuring this out by myself! AHHHHH! TYSM!!!

  • @manubachhal404
    @manubachhal404 3 роки тому +22

    Finally found a best channel coding in phyton .

  • @allen724
    @allen724 3 роки тому +33

    Thank you.
    For the edge case where the original value is a zero, in addition to setting something out of bounds, could we also just set it the actual value its represending? E.x. when 2 exists in [-1 , 0, ... ], could we set it to -2? That way we dont change the values in our input array since 2 is marked as existing already at some other place.

    • @ngneerin
      @ngneerin 3 роки тому +3

      This is what I came to comments section to comment

    • @JackLaw3000
      @JackLaw3000 2 роки тому +3

      This solution will be easier to read.

    • @anuragkushwaaha2091
      @anuragkushwaaha2091 2 роки тому

      This is exactly what I was also thinking of.

  • @ameyakale6334
    @ameyakale6334 Рік тому +4

    The logic used to solve this problem is just insane. I love it ♥ Great explanation!

  • @vadimkokielov2173
    @vadimkokielov2173 2 роки тому +12

    Thank you for all the good videos!
    One optimization I happened to come across that you missed. Your output range is actually not the length of the array, but the count of positive numbers in it -- a value you can compute very easily in your first loop.

    • @HarmanFarwah
      @HarmanFarwah Рік тому

      What would happen if we have duplicate positive values in our array?

    • @vadimkokielov2173
      @vadimkokielov2173 Рік тому +1

      We’re talking about the range. It’s a set already. If there are duplicate positives the range will be a little bigger. So what. The answer remains correct, and it’s still better than taking the length of the array

    • @HarmanFarwah
      @HarmanFarwah Рік тому +1

      @@vadimkokielov2173 I understand now. Thank you

    • @willaorito1149
      @willaorito1149 Рік тому

      how is it an optimization? we are still looping thru the array right? and the first non negative number we get is the answer

  • @cedricchen6946
    @cedricchen6946 2 роки тому +2

    This is the best solution and explanation I have ever found, I have been stuck in understanding index as a hash way, especially the “while” statement since I saw this question. And I harshly believe that the leetcode solution is not intuitive as it looks like

  • @linli7049
    @linli7049 3 роки тому +4

    Today I solved this problem and another problem called game of live, these two problems are difficult to figure out a solution with optimal space complexity because we need to store 2 pieces of information in a single figure, which is quite counter-intuitive.

  • @InfinityOver0
    @InfinityOver0 2 місяці тому +1

    Good solution. Suggestion: instead of setting only negatives to 0, you can just set negatives and 0 to len(a) - 1, which will save you the corner case work too. You also don't need to check you will go out of bounds in the left direction this way. I coded it without looking at your code, on my own and this is the solution I came up with, which I do think is better in readability.
    I can explain more if needed.

  • @varoonsb
    @varoonsb 6 місяців тому +3

    How in the seven hells are we supposed to find out/arrive at this "nobody knows right away" kind of solution in an interview? 😵‍💫😵‍💫😵‍💫
    Nice explanation btw.

    • @ashkan.arabim
      @ashkan.arabim Місяць тому +1

      here's how: abandon your hobbies, social life, well-being, and sideprojects for leetcode three months before your faang interview

  • @rdgibbard
    @rdgibbard 2 роки тому +3

    Cyclic sort seems less convoluted:
    class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
    i = 0
    while i < len(nums):
    # set all 0 and negatives nums above the possible solution
    nums[i] = nums[i] if nums[i] > 0 else len(nums) + 1
    # do a cyclic sort on nums ranging from 1..inf, skipping numbers
    # that are above the the possible solution
    correct_i = nums[i] - 1
    if nums[i] < len(nums) and nums[i] != nums[correct_i]:
    nums[i], nums[correct_i] = nums[correct_i], nums[i]
    else:
    i += 1
    # find the first number missing from its index
    for i in range(len(nums)):
    if nums[i] != i + 1:
    return i + 1
    return len(nums) + 1

  • @mangalegends
    @mangalegends 2 роки тому +5

    Sometimes I think I'm too stupid for leetcode lol. I never would have noticed that the solution would be less than or equal to the size of the array + 1. Apparently that's supposed to be obvious, but it wasn't obvious to me at all. Even knowing it now I still have to run through an example to confirm in my head that it's true

    • @bokistotel
      @bokistotel 14 днів тому

      I think 95% of the people who are not competitive programers would miss this. I feel exactly the same

  • @kamaleshs5324
    @kamaleshs5324 3 роки тому +12

    man the O(1) solution is brilliant and you explain it beautifully!

    • @alanl5030
      @alanl5030 2 роки тому +1

      Isn’t it technically O(n) because you have to iterate through the whole array

    • @kamaleshs5324
      @kamaleshs5324 2 роки тому +3

      I meant the O(1) memory solution!

  • @Jul835
    @Jul835 3 роки тому +4

    Best explanation I've found so far, thanks man

  • @ehabteima
    @ehabteima Рік тому +28

    It's impossible to come to the optimized solution unless you know it before hand.

  • @misoren9645
    @misoren9645 3 роки тому +5

    Thanks for the video.
    7:55 "If I wanna know if the value 2 exists in our input array, i = 2 - 1 = 1, check the 1 index, check if it is negative, negative tells us that 2 exists in our input array, we don't know where it exists but we know it exists" ... Sorry that didn't make any sense for me. As in, why is that true and why are we doing that?
    Is there another explanation for that main loop, of checking the number as index and transforming it to negative?
    Thanks in advance

    • @NeetCode
      @NeetCode  3 роки тому +3

      Lets consider an example where Input Array is length=3. That means 1, 2, or 3 must be the smallest missing positive, except if all three of those values are in the input, then the result will be 4.
      By change the input array to be negative, I'm basically marking which of the values in [1, 2, 3] show up in our array.
      Notice how since our input array is length=3, I can map 1 -> index 0, 2 -> index 1, and 3 -> index2.
      Once we've marked every value that appears as negative at it's corresponding index. Finally, in the final loop we can iterate through the modified input array. The first non-negative value we see, will give us the result:
      for example, if index=0 is not negative, that means the value = 1 is going to be the first missing positive.
      If index=1 is non negative, that means value=2 is the first missing positive.
      If every value in the input array is negative, that means value=4 is first missing positive. (Remember, i mentioned above that 4 is the worst case solution).

    • @psilencer
      @psilencer 2 місяці тому

      I agree this statement made no sense... the array in the example doesn't even contain 2.

  • @rentianxiang92
    @rentianxiang92 2 роки тому +5

    Thank you! you are just awesome, please post more leetcode videos before I get accepted by Microsoft :)

  • @c.4469
    @c.4469 2 роки тому +4

    Wow... Is it possible to come up with this solution without any help in a live coding session...? I think I never can :(

  • @mohitrsharma
    @mohitrsharma Рік тому

    Instead of replacing negative integers by 0, we can replace them by n+1, where n=len(A). The algorithm will still work without the condition of checking A[val-1]==0.

  • @AndrewSmith00000007
    @AndrewSmith00000007 3 роки тому +7

    I'm not sure why missing line 8 (20:41) was a bug. If an element is a neg value, that means we've already changed the sign and the num exists. We don't need to execute "if" scope. Otherwise, it's just redundant.

    • @binit1992
      @binit1992 2 роки тому +1

      because we are turning values negative down in this loop and a value could come as negative. Not doing this may miss some number that were actually positive , but flagged as negative to mark that particular index for third loop

  • @soumyadeepganguly3719
    @soumyadeepganguly3719 2 роки тому

    Beautifully done. I did it with a cycle sort type of method it got accepted but wasn't feeling good since it wasn't an O(n) solution. Got relief finally

    • @sandeshsgowda5593
      @sandeshsgowda5593 2 роки тому

      Cycle sort too gives O(n) time in worst case. Since numbers are sent to correct position (index) with each swap, you'll be doing only n-1 swaps and each index is checked only once to confirm its at correct position. So total n-1+n => O(n)
      ua-cam.com/video/JfinxytTYFQ/v-deo.html

  • @OriMoscovitz
    @OriMoscovitz 6 місяців тому +1

    11:20 There are so many things that are not clear I must say, you say since we know index 2 is negative we know that 3 exists in our input array, why? you don't explain why, and I don't get it. I'm rewatching and rewatching and yet can't figure it out the game with the indexes.

  • @bouzie8000
    @bouzie8000 11 місяців тому +4

    they expect me to figure out this solution in an interview? nuts. thanks for the video

  • @siningsun4160
    @siningsun4160 9 місяців тому

    this idea is super clever and insane. thanks!

  • @AsmaeMouradi
    @AsmaeMouradi Рік тому +1

    Thank you so much for all those videos you are really helping me. Waiting for more videos :)

  • @youngtraveler2799
    @youngtraveler2799 Рік тому

    dude you are the best on explanation hard problems ... last solution I had to watch 6 times to get the idea ... anyway thanks

  • @MiguelLopez-xv1gf
    @MiguelLopez-xv1gf 3 роки тому +1

    Thanks so much! you made it clear and easy to understand.
    One question, shouldn't like 8 be `if 1

  • @cloudx1057
    @cloudx1057 3 місяці тому

    man, this is so clear!!!

  • @lonen3rd
    @lonen3rd Рік тому +2

    Awesome explanation, I made a few modifications
    def first_positive(nums):
    n = len(nums)
    for i in range(n):
    if nums[i] < 1 or nums[i] > n:
    nums[i] = n+1
    for i in range(n):
    if abs(nums[i]) > 0 and abs(nums[i]) 0:
    nums[abs(nums[i]) -1] *= -1
    for i in range(n):
    if nums[i] > 0:
    return i+1
    return n+1

  • @breakthecode8323
    @breakthecode8323 2 роки тому

    You brilliantly explained it here

  • @fa11en1ce
    @fa11en1ce 2 роки тому +1

    Is it really o(1) space complexity if you need the entire input array in memory? Sounds like it's a 3n,n time space complexity vs a n,n for the hashmap solution

    • @andrewl8276
      @andrewl8276 2 роки тому +3

      Space complexity always refers to the EXTRA space being used, not including the input. If it included the input it'd be impossible to have O(1) space complexity, because the input growing would itself be increasing the space used.

  • @codingmario
    @codingmario Місяць тому

    Amazing explanation!!

  • @adityasalian9806
    @adityasalian9806 Рік тому

    1000 iq play turning the array into a hashset. so slick!

  • @Mr_SSK
    @Mr_SSK 2 роки тому

    Amazinggggg, crisp and clear!
    Thank you so much! :)

  • @jollyjoker6340
    @jollyjoker6340 2 роки тому +1

    20:20 There's no bug. You've already set all negative values to zero, the abs() does nothing.

    • @anujthakur05
      @anujthakur05 2 роки тому

      bro there's the bug because in the iterations of for loop it is possible that we update a value to negative whose index is yet to come in the for loop and hence we have to take the absolute value of that when we reach its index

    • @jollyjoker6340
      @jollyjoker6340 2 роки тому

      @@anujthakur05 Sure, but the if clause before the abs makes sure A[i] >= 1. Maybe that should have an abs too, can't really remember how this worked.

  • @shijieding1316
    @shijieding1316 2 роки тому +4

    Hello sir, great video, I just have a question that at 8:30, why does negative tell us 2 exists?

    • @Kavin2911
      @Kavin2911 10 місяців тому

      ik its too late to reply, After 9:23 the array becomes [3,0,6,3] now we have to check if the element is present or not , general process is we marking (arr[i]-1) index element to negative which represents arr[i] is present (we are using index to check, as the answer lies between 1 to len(arr)+1)

  • @rayahhhmed
    @rayahhhmed Рік тому

    this is such a beautiful solution

  • @time7192
    @time7192 6 місяців тому

    Thanks for this!

  • @Sophia-fw1rm
    @Sophia-fw1rm 2 роки тому +1

    but we can not use constant extra space how can we check it with a hashset?

  • @amrholo4445
    @amrholo4445 10 місяців тому

    really thanks a lot 💕💕

  • @rizzyhizzy173
    @rizzyhizzy173 3 роки тому +3

    Great videos. May I ask what whiteboard program you're using to draw up the explanations?

    • @NeetCode
      @NeetCode  3 роки тому +2

      Thanks! I'm using Microsoft Paint 3D (free) 🙂

  • @igorf243
    @igorf243 2 роки тому +2

    Tasks like this are more like a lifehacks

  • @akashdey5637
    @akashdey5637 Рік тому +1

    How does negative tell us that 2 exists in our input array?

  • @aryanyadav3926
    @aryanyadav3926 2 роки тому +1

    Well explained!

  • @barry_allen558
    @barry_allen558 2 роки тому +2

    I am confused about the edge case, Why can't we set it to -1 ? Because when we iterate last time all we care is whether the array[element] < 0, Right we don't care about the value.

    • @dheepthaaanand1133
      @dheepthaaanand1133 2 роки тому

      same doubt

    • @shubhamrathore3735
      @shubhamrathore3735 2 роки тому

      Because abs(-1) is 0 and we go and mark index 0 with a negative value but since -1 isn't in our array it will change the result we are looking for in the final loop

  • @radicalengineer2331
    @radicalengineer2331 2 роки тому

    Neetcode is really neat and to the point : btw coding all in python, why you choose python for all problem solving?

    • @fightapro
      @fightapro 2 роки тому +1

      Readability I’d assume

  • @hypermeero4782
    @hypermeero4782 2 роки тому

    set s(nums.begin(), nums.end());
    for(int i=1;;++i){
    if(!s.count(i))return i;
    }

  • @AAA-uv1ny
    @AAA-uv1ny 9 місяців тому

    brilliant , thanks dude.

  • @dingus2332
    @dingus2332 10 місяців тому

    Hi homies , I think my solution is more intuitive , it uses same logic as Neetcode , almost
    #My Solution ->
    #Marking 0 and neg elements with len of more than the array so that , it skips when outbound
    for i in range(len(nums)):
    if nums[i] < 0 or nums[i] == 0 :
    nums[i] = len(nums) + 1

    for n in nums :
    n = abs(n)
    #Dont consider length of more than the array (they cant be mapped)
    if n > len(nums):
    continue

    if nums[n - 1] < 0 :
    #Already visited then move on and ignore
    continue
    #Mark as visited , if can be mapped with the array
    nums[n - 1] = -1 * nums[n - 1]

    for i , n in enumerate(nums):
    if n > 0 :
    #Not visited
    return i + 1
    print(nums)
    return len(nums) + 1 #Does not have a missing integer in the indexes of the array , so first missing integer must come after the array , which would be the len(nums) + 1 itself

  • @akshatgupta107
    @akshatgupta107 3 роки тому

    Such a good explanation. Thank you sir

  • @ArjunKalidas
    @ArjunKalidas 2 роки тому +2

    This is the best and understandable explanation, I came across for this problem. Great job, please keep making more videos. Could you please make a video of "couple holding hands" problem on leetcode? Also, if you could explain the union find and connected component approach if you are taking that one in detail, that would be great.

  • @sumithbabubare8297
    @sumithbabubare8297 2 роки тому

    Thanks a lot for all the explanation

  • @orangethemeow
    @orangethemeow 2 роки тому

    I tried this solution but time limit exceeded. It worked by adding if nums[i] > len(nums) + 1 set it to 0 at beginning together with setting negative numbers to 0

  • @허바드제이콥
    @허바드제이콥 3 роки тому +1

    I seriously love you. got my first interview next wednesday.

    • @NeetCode
      @NeetCode  3 роки тому +1

      Good luck! You're gonna do great 🙂

    • @ryanmanchikanti5265
      @ryanmanchikanti5265 3 роки тому

      Please let us know how it goes , all the best.

    • @YeetYeetYe
      @YeetYeetYe 2 роки тому

      How did it go man?

    • @enderaslan7998
      @enderaslan7998 2 роки тому

      @@ryanmanchikanti5265 any good news??

  • @chandinivelilani3863
    @chandinivelilani3863 2 роки тому

    Amazing Explanation!

  • @orellavie6233
    @orellavie6233 2 роки тому

    I don't understand why we need to absolute the A[i]... If a one loop before it made every value greater or equal 0..
    Other than that, great answer

  • @loba8924
    @loba8924 3 роки тому

    What a great explanation. Thanks.

  • @dhruv3847
    @dhruv3847 10 місяців тому

    Is there a solution where we could use bit manipluation(xor)?

  • @JohnIdlewood
    @JohnIdlewood Рік тому

    Is there algorithm where we can also restore the original array ?

  • @GaneshBhutekar-nu1gd
    @GaneshBhutekar-nu1gd 2 місяці тому +1

    i wil never find that way to solve this solution by myself

  • @iharshgarg
    @iharshgarg 10 місяців тому

    wow.. that was really smart way to store information in the given array itself without creating a new array.. wtf!!

  • @aparnajadhav9197
    @aparnajadhav9197 2 роки тому +1

    Are you sure this is working? because i wrote this exact same code in leetcode, but only 12 test cases passed :(

  • @WaldoTheWombat
    @WaldoTheWombat Рік тому

    Haven't watched the video yet, but can't we just do quick sort while keeping a variable called min_positive which we will always compare the the current number we are sorting?

    • @xuwang9205
      @xuwang9205 Рік тому +1

      sorting need at least O(nlog(n)) time. The question requires to solve in O(n), which makes it a hard question.

  • @swarnimvarshneya6944
    @swarnimvarshneya6944 10 місяців тому

    but after changing negative values to 0 in the first loop how does the bug bother in last?

  • @krateskim4169
    @krateskim4169 10 місяців тому

    Thank you so much

  • @jonaskhanwald566
    @jonaskhanwald566 3 роки тому +2

    punctuality... perfect timing daily... in India its 9.30. Keep posting

  • @myprag23
    @myprag23 15 днів тому

    part with the abs value and paying attention to negatives etc confused me. Here is my solution which takes 42 ms and beats 61% of the solutions:
    def firstMissingPositive(self, nums: List[int]) -> int:
    nums_len = len(nums)
    for i in range(nums_len):
    while 0 < nums[i]

  • @buzzClicksMedia
    @buzzClicksMedia Рік тому

    But we are modifing the input , should we do that?

  • @xzex2609
    @xzex2609 Рік тому +1

    wow i lost it in the middle / but you are really great in describing problems

  • @tanishbansal1058
    @tanishbansal1058 5 місяців тому

    In the second loop abs isn’t necessary all values will be 0 or more, what am i missing

  • @kevinbiazon8069
    @kevinbiazon8069 3 роки тому

    Sir! you are a legend!!!!

  • @eatandplay7433
    @eatandplay7433 6 місяців тому

    Sorry to ask a basic question, I m a newbie..why are we converting array to hashset here? Can someone pls explain

  • @furkanozyurt6845
    @furkanozyurt6845 8 місяців тому

    Thank you right man right your explanation right is very right clear right but I wish right you use right the word of "right" right less right.

  • @embarrassed_dodo
    @embarrassed_dodo 6 місяців тому

    Forget about problem even the solution is making me insane

  • @sarahcharlotte6681
    @sarahcharlotte6681 2 роки тому

    Every coding questions has different different logics. How to remember the logics and keep it in mind in interview

  • @junkoe3808
    @junkoe3808 2 роки тому +1

    I solved it differently with same memory and time complexity.

  • @aashitAgrawal
    @aashitAgrawal Рік тому

    solution was indeed very smart

  • @andreykalmatskiy2656
    @andreykalmatskiy2656 Рік тому

    When you modify input, it is not o(1) space

  • @garywasherefirst
    @garywasherefirst 2 роки тому

    insane explanation

  • @APudgyPanda96
    @APudgyPanda96 2 роки тому +2

    What an unbelievably stupid problem

  • @suyashrahatekar4964
    @suyashrahatekar4964 Рік тому

    How tf am I supposed to come up with that logic? I'm no Einstein.

  • @leul1407
    @leul1407 2 роки тому

    You are the best

  • @sreevishal2223
    @sreevishal2223 3 роки тому

    In the middle of the video the audio went out of sync which confuses your explanation, please check that out.

  • @mingjuhe1514
    @mingjuhe1514 3 роки тому

    Thanks!

  • @hannanathar3627
    @hannanathar3627 11 місяців тому

    besttt explanation

  • @mdnoor4750
    @mdnoor4750 10 місяців тому

    the code is wrong in the second loop it should check if 1 = len(A):

  • @AmarjeetKumar-en1gk
    @AmarjeetKumar-en1gk Рік тому +1

    i am not able to understand for [1, 2, 0]. can anyone explain

  • @whys2016
    @whys2016 2 роки тому

    why not just put -2 in index 1 when it is the edge case? that's easier than computing the out-of-bounds index.

    • @travelwithme99-0
      @travelwithme99-0 Рік тому

      because then 2 will be found in the array afterwads, it may have been the smallest positive missing.

  • @rahulranjan7567
    @rahulranjan7567 Рік тому

    It is so much similar to Pigeon Hole algorithm. Correct me if I am wrong

  • @ngoctang6925
    @ngoctang6925 Рік тому

    This solution is great but I find it slower and takes more memory than a short and easier to understand solution. Can I ask why is that?

    • @m.kamalali
      @m.kamalali Рік тому

      it beats 97 in memory and 75 in time

    • @ngoctang6925
      @ngoctang6925 Рік тому

      @@m.kamalali I agree that it can beat more than 90 in memory but it only beats 50 at max for me

  • @sushantrocks
    @sushantrocks 3 роки тому

    Dude how do you manage when you need sorted containers in python.
    I know LC allows importing sortedcontainers 3rd party module - but any other way? Might be needed in interviews.

  • @azamatik3
    @azamatik3 Рік тому

    you were able to explain the inexplicable, a u god?

  • @RiazKhan-b6e
    @RiazKhan-b6e 2 місяці тому

    How can a person get this solution without watching any tutorials and solutions?

  • @anubhavsinha9526
    @anubhavsinha9526 9 місяців тому

    can someone explain why he did i-1 and made it negative for a value, doesn't make sense, out of nothing

  • @josearbelo5263
    @josearbelo5263 2 роки тому

    Why is it that I can solve this one in about two minutes but the easy ones take me hours. 😭

    • @bh4541
      @bh4541 2 роки тому

      you lie

  • @amangaur4231
    @amangaur4231 2 роки тому

    Man you are Awesome :|o