Possibility of using loops instead of traps
Your first DFA is minimal. To see this, for each pair of states $q_i \neq q_j$ we need to come up with a word $w$ such that $\delta(q_i,w) \in F$ and $\delta(q_j,w) \notin F$, or vice versa, where $F$ is the set of accepting states.
Here is such a list of words:

$q_0,q_1$: $\delta(q_0,b) \notin F$ and $\delta(q_1,b) \in F$.
$q_0,q_2$: $\delta(q_0,\epsilon) \notin F$ and $\delta(q_2,\epsilon) \in F$.
$q_0,q_3$: $\delta(q_0,ab) \in F$ and $\delta(q_3,ab) \notin F$.
$q_1,q_2$: $\delta(q_1,\epsilon) \notin F$ and $\delta(q_2,\epsilon) \in F$.
$q_1,q_3$: $\delta(q_1,b) \in F$ and $\delta(q_3,b) \notin F$.
$q_2,q_3$: $\delta(q_2,\epsilon) \in F$ and $\delta(q_3,\epsilon) \notin F$.