ধরুন আমাদের ২৪-ঘণ্টার ক্লক টাইম পয়েন্টের একটি তালিকা আছে "Hour:Minutes" ফরম্যাটে, আমাদের তালিকায় যেকোনো দুটি টাইম পয়েন্টের মధ్య ন্যূনতম মিনিট পার্থক্য বের করতে হবে। তাই যদি ইনপুট হয় [“12:30”,”15:17”], তবে এটি ১৬৭ ফেরত দেবে।
এটি সমাধান করতে আমরা নিম্নলিখিত ধাপগুলি অনুসরণ করব −
- ok নামে 24*60 + 1 আকারের একটি অ্যারে সংজ্ঞায়িত করুন, এবং প্রাথমিকভাবে সব false।
- n := tp-এর আকার
- i = 0 থেকে n – ১ পর্যন্ত
- hr := সময় থেকে ঘণ্টা অংশ
- min := স্ট্রিংয়ের মিনিট অংশ
- time := hr * 60 + min
- যদি ok[time] true হয়, তবে ০ ফেরত দিন, অন্যথায় ok[time] true সেট করুন।
- last := ০, first := inf, ret := inf, prev := -inf
- i = 0 থেকে 24*60 পর্যন্ত
- যদি ok[i] true হয়, তবে
- last := i, last-এর max
- first := i এবং first-এর min
- যদি prev -inf না হয়, তবে ret := ret এবং last – prev-এর min
- prev := i
- যদি ok[i] true হয়, তবে
- ret এবং 24*60+first-last-এর ন্যূনতম ফেরত দিন।
বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশনটি দেখুন &mnus;
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: int findMinDifference(vector<string>& tp) { vector <bool> ok(24 * 60 + 1, false); int n = tp.size(); for(int i = 0; i < n; i++){ int hr = stoi(tp[i].substr(0, 2)); int min = stoi(tp[i].substr(3, 2)); int time = hr * 60 + min; if(ok[time]) return 0; ok[time] = true; } int last = 0; int first = INT_MAX; int ret = INT_MAX; int prev = INT_MIN; for(int i = 0; i <= 24 * 60; i++){ if(ok[i]){ last = max(i, last); first = min(i, first); if(prev != INT_MIN) ret = min(ret, last - prev); prev = i; } } return min(ret, 24 * 60 + first - last); } }; main(){ vector<string> v = {"12:30","15:17"}; Solution ob; cout << (ob.findMinDifference(v)); }ইনপুট
["12:30","15:17"]
আউটপুট
167