第一題:
原題鏈接:452. 用最少數量的箭引爆氣球 - 力扣(LeetCode)
思路:先根據每個元素的第一個值進行排序,然后從第一個元素開始遍歷,這里要注意我們初始化結果值的時候直接初始化為1,因為無論如何都是需要一把箭引爆氣球。開始遍歷的時候當前元素的左邊界如果大于前一個元素的右邊界的話說明此時需要加一把箭才能引爆氣球,如果不是則跟新當前元素的右邊界為當前右邊界和前一個元素的右邊界的最小值。
代碼如下:
class Solution {
public:static bool cmp(vector<int> a, vector<int> b){return a[0] < b[0];}int findMinArrowShots(vector<vector<int>>& points) {if(points.size() == 0) return 0;int res = 1;sort(points.begin(), points.end(), cmp);for(int i = 1; i < points.size(); i++){if(points[i][0] > points[i - 1][1]){res++;}else{points[i][1] = min(points[i - 1][1], points[i][1]);}}return res;}
};
第二題:
原題鏈接:435. 無重疊區間 - 力扣(LeetCode)
思路:
首先也是要排序,如果當前元素的左邊界小于前一個元素的右邊界,說明重疊了需要去掉一個,然后將右邊界跟新為當前元素右邊界和前一個元素右邊界的較小值。
代碼如下:
class Solution {
public:static bool cmp(vector<int> a, vector<int> b){return a[0] < b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if(intervals.size() == 0) return 0;int res = 0;sort(intervals.begin(), intervals.end(), cmp);for(int i = 1; i < intervals.size(); i++){if(intervals[i][0] < intervals[i - 1][1]){res++;intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);}}return res;}
};
第三題:
原題鏈接:763. 劃分字母區間 - 力扣(LeetCode)
思路:
首先用一個unordered_map數據結構來存放每個字母的最遠下標位置。
首先先遍歷整個數組,map存放字母對應的最遠下標值。
然后再定義一個左邊界和右邊界和結果數組。
再次遍歷。將右邊界right更新了當前元素的最遠值。當遍歷到i的值等于right的時候說明劃分到一個片段了,將right - left + 1的值填到結果數組中
代碼如下:
class Solution {
public:vector<int> partitionLabels(string s) {unordered_map<char, int> map;for(int i = 0; i < s.size(); i++){map[s[i]] = i;}vector<int> res;int left = 0, right = 0;for(int i = 0; i < s.size(); i++){right = max(right, map[s[i]]);if(right == i){res.push_back(right - left + 1);left = right + 1;}}return res;}
};