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
xby 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
ithlock, the energy of the sword must reach at leaststrength[i]. - After breaking a lock, the energy of the sword resets to 0, and the factor
xincreases by a given valuek.
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.length1 <= n <= 81 <= K <= 101 <= 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