"Picking Cards" challenge
The immediate thing that jumps out to me is your use of an ArrayList for this. By continuously removing the first element, you force the array list to shift everything left one space each time (an O(n) operation assuming no underlying optimizations!)

Instead of removing from the array list (incurring an expensive shift), I would recommend that you keep an index.

    while(cardsLeft.size() &gt;= 1)
    {
        //if we can't pick up the next card, we're at a dead end - no solutions
        if(cardsLeft.get(0) &gt; numPicked)
            return 0;

        // ...
        for(int i: cardsLeft)
        {   
             // ...
        }

        // ...

        cardsLeft.remove(0);
        // ...
    }


becomes

    int cardIndex = 0;
    while(cardIndex &lt; cardsLeft.length())
    {
        //if we can't pick up the next card, we're at a dead end - no solutions
        if(cardsLeft.get(cardIndex) &gt; numPicked)
            return 0;
        // ...
        for(int i = cardIndex; i &lt; cardsLeft.length(); ++i)
        {   
             // ...
        }
        // ...

        //cardsLeft.remove(0);
        ++cardIndex
        // ...
    }