Nice solution. However, I find the trick with k = INT_MAX dicey. For one, it's hard to understand, and for two, will it work with real case of k == INT_MAX?

If's easy to handle the edge case of k == 0 separately:

if(k == 0)
if(i > 0 and nums[i] == 0 and nums[i-1] == 0)
return true;