代码随想录算法训练营Day30

最少数量的箭引爆气球

这里的重点在更新最小右边界

class Solution {  
    public int findMinArrowShots(int[][] points) {  
        if(points.length==0){  
            return 0;  
        }  
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));  
        int count = 1;  
        for (int i = 1; i < points.length; i++) {  
            if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=  
                count++;  
            } else {
                points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界  
            }  
        }  
        return count;  
    }  
}

无重叠区间

类似于上题

class Solution {  
    public int eraseOverlapIntervals(int[][] intervals) {  
        int result = 0;  
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));  
        for(int i = 1;i<intervals.length;i++){  
            if(intervals[i][0]<intervals[i-1][1]){  
                result++;  
                intervals[i][1] = Math.min(intervals[i][1],intervals[i-1][1]);  
            }  
        }  
        return result;  
    }  
}

划分字母区间

同样的字母只能出现在一个区间中,不能出现在两个区间中
如果包含a,则需要包含所有的a,创建最远位置的数组

public class Solution {  
    public List<Integer> partitionLabels(String S) {  
        int[] lastIndex = new int[26]; // 记录每个字符最后出现的位置  
        for (int i = 0; i < S.length(); i++) {  
            lastIndex[S.charAt(i) - 'a'] = i;  
        }  
  
        List<Integer> result = new ArrayList<>();  
        int left = 0, right = 0;  
        for (int i = 0; i < S.length(); i++) {  
            right = Math.max(right, lastIndex[S.charAt(i) - 'a']);  
            if (i == right) {  
                result.add(right - left + 1);  
                left = i + 1;  
            }  
        }  
  
        return result;  
    }  
}
posted @ 2025-04-28 09:30  Anson_502  阅读(21)  评论(0)    收藏  举报