31. Minimum Number of Taps to Open to Water a Garden
The problem can be found at the following link: Question Link
My Approach
This is a question on greedy approch, as we have given how to find the range of the given taps . We can calculate the range of each tap and check if we can manage to find a tap which have largest current range. we can do it as :
Initialize variables:
minRangeandmaxRangeto keep track of the minimum and maximum positions that can be covered by the currently selected taps (both initially set to 0).tapsto keep track of the number of taps used (initialized to 0).curindexto keep track of the index of the last selected tap (initialized to 0).
Create a while loop that continues until
maxRangeis greater than or equal ton. This loop is used to extend the covered range step by step.Inside the while loop, iterate through the taps (represented by the
rangesvector) starting from thecurindex. For each tapi:Check if the tap can cover the current position (
i - ranges[i]) and if it can extend the range further (i + ranges[i] > maxRange).If both conditions are met, update
maxRangetoi + ranges[i]and updatecurindextoi. This tap is chosen as it extends the maximum coverage.
After examining all taps within the current range, if
minRangeis equal tomaxRange, it means that no tap can be selected to extend the coverage further. In this case, return -1 to indicate that it's impossible to cover the entire range.Increment
tapsto count the tap that has been used to extend the coverage.Update
minRangetomaxRangeto indicate that the current range has been fully covered.Repeat steps 3-6 until
maxRangeis greater than or equal ton.
Time and Auxiliary Space Complexity
Time Complexity:
O(n)Auxiliary Space Complexity:
O(1)because we used an extra queue..
Code (C++)
class Solution {
public:
int minTaps(int n, vector<int>& ranges) {
int minRange =0, maxRange =0;
int taps =0; int curindex =0;
while(maxRange < n){
for(int i=curindex;i<ranges.size();i++){
if(i-ranges[i]<=minRange && i+ranges[i]>maxRange){
maxRange = i+ranges[i];
curindex = i;
}
}
if(minRange == maxRange) return -1;
taps++;
minRange = maxRange;
}
return taps;
}
};Contribution and Support
For discussions, questions, or doubts related to this solution, please visit our discussion section. We welcome your input and aim to foster a collaborative learning environment.
If you find this solution helpful, consider supporting us by giving a ⭐ star to the rishabhv12/Daily-Leetcode-Solution repository.
Last updated
Was this helpful?