* Given a num, find the combination from hours array {8, 4, 2, 1}
* and minutes array {32, 16, 8, 4, 2, 1}
public List<String> readBinaryWatch(int num) {
List<String> res = new ArrayList<>();
int[] hours = {8, 4, 2, 1};
int[] minutes = {32, 16, 8, 4, 2, 1};
for (int i = 0; i <= num; i++) {
// Get i elements from hours array and the remaining (num - i) from minutes
List<Integer> hoursList = generateDigit(hours, i, 12);
List<Integer> minutesList = generateDigit(minutes, num - i, 60);
for (int hour : hoursList) {
for (int min : minutesList) {
// Convert digit to correct time form
res.add(hour + ":" + (min < 10 ? "0" + min : min));
public List<Integer> generateDigit(int[] nums, int count, int max) {
List<Integer> res = new ArrayList<>();
recGenerateDigit(nums, count, 0, 0, max, res);
public void recGenerateDigit(int[] nums, int count, int pos, int sum, int max, List<Integer> res) {
// Exclude invalid value of hour (>= 12) and minute (>= 60)
for (int i = pos; i < nums.length; i++) {
recGenerateDigit(nums, count - 1, i + 1, sum + nums[i], max, res);