1723. Find Minimum Time to Finish All Jobs

DFS with pruning

T: O(k^n), n is jobs array size, but with lots pruning, beats 88%

S: O(n), recursion stack

class Solution {
    int res = Integer.MAX_VALUE;
    public int minimumTimeRequired(int[] jobs, int k) {
        
        Arrays.sort(jobs); // prune1, put large one first, quick fail
        reverse(jobs);
        
        dfs(jobs, 0, new int[k]);
        return res;
    }
    private void dfs(int[] jobs, int start, int[] bucket) {
        
        if (start == jobs.length) {
            res = Math.min(res, calMax(bucket));
            return;
        }
        
        for (int i = 0; i < bucket.length; i++) {
            if (i > 0 && bucket[i] == bucket[i - 1]) { // prune2: when try, pass duplicate data
                continue; 
            }
            if (calMax(bucket) >= res) { // prune3: if combination's max is bigger than result, pass
                continue;
            }
            bucket[i] += jobs[start];
            dfs(jobs, start+1, bucket);
            bucket[i] -= jobs[start];
        }
    }
    
    // cal in bucket, the max value now
    private int calMax(int[] bucket) {
        int max = 0;
        for (int i = 0; i < bucket.length; i++) {
            max = Math.max(max, bucket[i]);
        }
        return max;
    }
    private void reverse(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
}

bucket:[0, 0, 0], start:0
bucket:[3, 0, 0], start:1
bucket:[6, 0, 0], start:2
bucket:[8, 0, 0], start:3
res:8
bucket:[6, 2, 0], start:3
res:6
bucket:[3, 3, 0], start:2
bucket:[5, 3, 0], start:3
res:5
bucket:[3, 3, 2], start:3
res:3

/*
                 jobs : [3 2 3]
                 
                 jobs dispatch to 3 bucket
             /.  
        [0,0,0]                                     start = 0
         /
       [3,0,0]                                      start = 1
        /
     [6,0,0]              [3, 3, 0]                 start = 2
     / 
     [8, 0, 0]          [5, 3, 0]    [6, 2, 0]      bucket:[3, 3, 2], start:3 start = 3
     cal res = 8        cal res = 5  cal res = 6    cal res = 3
     
     
     // in this case, don't keep going
     if (calMaxBucket(bucket) >= res) {
          continue;
      }
*/

Last updated