สมมติว่ามีบอลลูนทรงกลมจำนวนไม่มากกระจายอยู่ในพื้นที่สองมิติ สำหรับบอลลูนแต่ละลูก จะมีพิกัดเริ่มต้นและจุดสิ้นสุดของเส้นผ่านศูนย์กลางแนวนอน จุดเริ่มต้นเล็กกว่าจุดสิ้นสุดเสมอ จะมีไม่เกิน 104 ลูกโป่ง ลูกศรหนึ่งลูกสามารถยิงขึ้นในแนวตั้งได้อย่างแม่นยำจากจุดต่างๆ ตามแนวแกน x บอลลูนที่มีตำแหน่ง xstart ถึง xend ระเบิดด้วยลูกศรที่ยิงไปที่ x ถ้า xstart =x =xend ไม่จำกัดจำนวนลูกธนูที่สามารถยิงได้ สมมติให้ลูกธนูหนึ่งลูกพุ่งขึ้นไปอย่างไม่สิ้นสุด เราต้องหาจำนวนลูกศรขั้นต่ำที่ต้องยิงเพื่อระเบิดลูกโป่งทั้งหมด ดังนั้นหากอินพุตเป็นเหมือน [[10,16],[2,8], [1,6], [7,12]] ผลลัพธ์จะเป็น 2 ดังนั้นหากเรายิงจาก x =6 มันก็จะ จะระเบิด [2,8] และ [1,6] และบอลลูนอีกอันจาก x =11 เพื่อระเบิดส่วนที่เหลือ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า intersect() เพื่อตรวจสอบว่าตำแหน่งตัดกันหรือไม่
-
อีกวิธีหนึ่ง manipulate() เพื่อจัดการพิสัยหลังจากหาพิสัยของบอลลูนที่ตัดกันทั้งหมด
-
วิธีที่แท้จริงคือการวางตำแหน่งบอลลูนเป็น pos
-
จัดเรียงอาร์เรย์ pos ตามตำแหน่งสิ้นสุด
-
n :=จำนวนลูกโป่ง ถ้า n เป็น 0 ให้คืนค่า 0
-
currEnd :=ตำแหน่งสิ้นสุดของรายการแรกของ pos หลังจาก soring
-
cnt :=1
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
ถ้า currEnd <ตำแหน่งเริ่มต้นของ pos[i] ให้เพิ่มจำนวนขึ้น 1 และ currEnd :=ตำแหน่งสิ้นสุดของ pos[i]
-
-
จำนวนคืน
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: bool intersect(vector <int>& a, vector <int>& b){ return a[1] >= b[0]; } static bool cmp(vector <int>& a, vector <int>& b){ return a[1] < b[1]; } void manipulate(vector <int>& a, vector <int>& b){ a[0] = min(a[0], b[0]); a[1] = max(a[1], b[1]); } int findMinArrowShots(vector<vector<int>>& points) { sort(points.begin(), points.end(), cmp); int n = points.size(); if(!n) return 0; int currEnd = points[0][1]; int cnt = 1; for(int i = 1; i < n; i++){ if(currEnd < points[i][0]){ cnt++; currEnd = points[i][1]; } } return cnt; } }; main(){ vector<vector<int>> v = {{10,16},{2,8},{1,6},{7,12}}; Solution ob; cout << (ob.findMinArrowShots(v)); }
อินพุต
[[10,16],[2,8],[1,6],[7,12]]
ผลลัพธ์
2