สมมติว่าเรามีช่วง a สำหรับแต่ละช่วง i ให้ตรวจสอบว่ามีช่วง j ที่มีจุดเริ่มต้นมากกว่าหรือเท่ากับจุดสิ้นสุดของช่วง i หรือไม่ ซึ่งสามารถทำได้ เรียกว่า j อยู่ทาง "ขวา" ของ i สำหรับช่วงเวลา i ใดๆ เราต้องเก็บดัชนีช่วงเวลาต่ำสุดของ j ซึ่งระบุว่าช่วงเวลา j มีจุดเริ่มต้นต่ำสุดเพื่อสร้างความสัมพันธ์ "ถูกต้อง" สำหรับช่วงเวลา i เมื่อไม่มีช่วง j ให้เก็บ -1 สำหรับช่วงเวลา i และสุดท้าย เราต้องการเอาท์พุตค่าที่เก็บไว้ของแต่ละช่วงเวลาเป็นอาร์เรย์ ดังนั้นหากอินพุตเป็น [[3,4], [2,3], [1,2]] ดังนั้นเอาต์พุตจะเป็น [-1, 0, 1] เนื่องจากไม่มีช่วงที่เหมาะสมดังกล่าวสำหรับ [3 , 4], สำหรับช่วง [2,3] ช่วง [3,4] มีจุดเริ่มต้นต่ำสุด-"ขวา"; และสำหรับ [1,2] ช่วงเวลา [2,3] จะมีจุดเริ่มต้นต่ำสุด-"ขวา"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของช่วงเวลาอาร์เรย์ สร้าง am array ret ขนาด n แล้วเติมโดยใช้ -1 ให้สร้างแผนที่ที่เรียกว่า m
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของช่วงเวลา
-
หากช่วงเวลา[i, 0] เป็น m ให้ข้ามไปยังช่วงถัดไป
-
ม[ช่วงเวลา[i, 0]] :=ผม + 1
-
-
สำหรับผมอยู่ในช่วง n – 1 ลงไปที่ i>=0
-
it :=ชี้ไปที่คู่คีย์-ค่าที่มีคีย์ที่เล็กที่สุด แต่ไม่เล็กกว่า intervals[i, 1]
-
ถ้าค่าของมันคือ 0 ให้ทำซ้ำต่อไป
-
ret[i] :=ค่าของมัน – 1
-
-
รีเทิร์น
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
int n = intervals.size();
vector <int> ret(n, -1);
map <int, int< m;
for(int i = 0; i < intervals.size(); i++){
if(m.count(intervals[i][0])) continue;
m[intervals[i][0]] = i + 1;
}
for(int i = n - 1; i >= 0; i--){
map <int, int> :: iterator it = m.lower_bound(intervals[i][1]);
if(it->second == 0) continue;
ret[i] = it->second - 1;
}
return ret;
}
};
main(){
vector<vector<int>> v = {{3,4},{2,3},{1,2}};
Solution ob;
print_vector(ob.findRightInterval(v));
} อินพุต
[[3,4],[2,3],[1,2]]
ผลลัพธ์
[-1,0,1]