Skip to content

3649. Minimum Time To Break Locks I

Difficulty: Medium

LeetCode Problem View on GitHub


3649. Minimum Time to Break Locks I

Medium


Bob is stuck in a dungeon and must break n locks, each requiring some amount of energy to break. The required energy for each lock is stored in an array called strength where strength[i] indicates the energy needed to break the ith lock.

To break a lock, Bob uses a sword with the following characteristics:

  • The initial energy of the sword is 0.
  • The initial factor x by which the energy of the sword increases is 1.
  • Every minute, the energy of the sword increases by the current factor x.
  • To break the ith lock, the energy of the sword must reach at least strength[i].
  • After breaking a lock, the energy of the sword resets to 0, and the factor x increases by a given value k.

Your task is to determine the minimum time in minutes required for Bob to break all n locks and escape the dungeon.

Return the minimum time required for Bob to break all n locks.

 

Example 1:

Input: strength = [3,4,1], k = 1

Output: 4

Explanation:

Time Energy x Action Updated x
0 0 1 Nothing 1
1 1 1 Break 3rd Lock 2
2 2 2 Nothing 2
3 4 2 Break 2nd Lock 3
4 3 3 Break 1st Lock 3

The locks cannot be broken in less than 4 minutes; thus, the answer is 4.

Example 2:

Input: strength = [2,5,4], k = 2

Output: 5

Explanation:

Time Energy x Action Updated x
0 0 1 Nothing 1
1 1 1 Nothing 1
2 2 1 Break 1st Lock 3
3 3 3 Nothing 3
4 6 3 Break 2nd Lock 5
5 5 5 Break 3rd Lock 7

The locks cannot be broken in less than 5 minutes; thus, the answer is 5.

 

Constraints:

  • n == strength.length
  • 1 <= n <= 8
  • 1 <= K <= 10
  • 1 <= strength[i] <= 106

Solution

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

class Solution {
    public int findMinimumTime(List<Integer> strength, int k) {
        int n = strength.size(), mini = Integer.MAX_VALUE;

        int total = 1;
        for (int i = 1; i <= n; i++)
            total *= i;

        while (total >= 0) {
            mini = Math.min(mini, solve(strength, k));
            nextPermutation(strength);
            total--;
        }
        return mini;
    }

    private int solve(List<Integer> arr, int k) {
        int ans = 0, currentEnergy = 0, currentFactor = 1;
        for (int i = 0; i < arr.size(); i++) {
            if (arr.get(i) % currentFactor == 0)
                ans += arr.get(i) / currentFactor;
            else
                ans += 1 + (arr.get(i) / currentFactor);
            currentFactor += k;
            currentEnergy = 0;
        }
        return ans;
    }

    private void nextPermutation(List<Integer> nums) {
        int n = nums.size();
        int i = n - 2;
        while (i >= 0 && nums.get(i) >= nums.get(i + 1))
            i--;
        if (i >= 0) {
            int j = n - 1;
            while (nums.get(j) <= nums.get(i))
                j--;
            swap(nums, i, j);
        }
        reverse(nums, i + 1, n - 1);
    }

    private void swap(List<Integer> nums, int i, int j) {
        Collections.swap(nums, i, j);
    }

    private void reverse(List<Integer> nums, int start, int end) {
        while (start < end)
            swap(nums, start++, end--);
    }
}

Complexity Analysis

  • Time Complexity: O(?)
  • Space Complexity: O(?)

Approach

Detailed explanation of the approach will be added here