P and NP problems

polynomial time refers to the amount of time an algo takes to complete relative of the size of it's input.
an algo runs in polynomial time if it's running time T(n) is upper-bounded by a polynomial expression in the size of the input n
T(n) = O(n^k)
where k is some constant (like 1, 2, 3...)

P is solvable && verifiable in polynomial time
NP is verifiable in polynomial time (Hard to solve, easy to check)
NP Hard is not verifiable or solvable in polynomial time.
NP-Complete: if you can solve one of them in polynomial time, you can solve all of them in polynomial time.