用最少数量的箭引爆气球

思路

如果当前数组的左区间没有覆盖前一个数组的右区间,就需要新的箭来击穿。不然就更新新的右区间。

class Solution {
  static bool cmd(const vector<int>&a,vector<int>&b){
      if(a[0]==b[0]){ return a[1]<b[1];
      }
      return a[0]<b[0];
  }
public:
  int findMinArrowShots(vector<vector<int>>& points) {
      if(points.size()<=1){return points.size();}
      sort(points.begin(),points.end(),cmd);
      int result=1;
      for(int i =1;i<points.size();i++){
          if(points[i][0]>points[i-1][1]){
              result++;
          }
          else points[i][1]=min(points[i][1],points[i-1][1]);
      }
      return result;
  }
};

不重叠区间

给出一个集合序列,移除某些序列,使得剩余区间不重叠。
一开始,思路是如果后一个序列的左边界小于前一个序列的右边界,那么就计数,然后删除该序列。
产生的问题是我在遍历的过程中删除元素,会导致数组越界。
题解的思路是记录不重叠的元素序列,重叠的是总数减去不重叠,这样做的好处是避免了在遍历过程中改变数组的大小。具体思路是:如果当前数组的左边界大于前一个数组(即尾数组)的右边界,就进行计数,并且更新尾数组。

划分字母区间

记录第一个下标的字母,找到重复的作为一个节点,如果下一个和前面的不同,说明找到了第一个分割点。

题解

class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27]={0};
        for(int i=0;i<s.size();i++){
          hash[s[i]-'a'] =i;
        }
        int left=0;
        int right=0;
        vector<int> result;
        for(int i=0;i<s.size();i++){
            right=max(right,hash[s[i]-'a']);
            if(i==right){
            result.push_back(right-left+1);
            left=i+1;
            }

        }
        return result;
    }
};

哈希表里面存放的是什么:


哈希表存放字母出现的最大下标
hash[0] 存放字母a出现的最大下标;

posted on 2025-12-07 19:24  FAfa_C++  阅读(3)  评论(0)    收藏  举报