算法训练(leetcode)二刷第二十六天 | *452. 用最少数量的箭引爆气球、435. 无重叠区间、*763. 划分字母区间

刷题记录

  • [*452. 用最少数量的箭引爆气球](#*452. 用最少数量的箭引爆气球)
  • [435. 无重叠区间](#435. 无重叠区间)
  • [*763. 划分字母区间](#*763. 划分字母区间)

*452. 用最少数量的箭引爆气球

leetcode题目地址

先对气球的坐标按照Xstart进行升序排序,只要两个气球之间挨着就可以一箭射穿,因此排序后查看后一个气球的起始坐标是否与前一个气球的结束坐标挨着(挨着:后一个起始坐标<=前一个结束坐标)。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)

java 复制代码
// java
class Solution {
    public int findMinArrowShots(int[][] points) {
        // 按照起始坐标从小到大排序 
        // 使用Integer内置比较方法,不会溢出
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int cnt = 1;
        for(int i=1; i<points.length; i++){
            if(points[i][0] > points[i-1][1]){
                  cnt++;
            }else{
                points[i][1] = Math.min(points[i][1], points[i-1][1]); 
            }
            // System.out.println(points[i][0] + " " + points[i][1]);
        }
        return cnt;
    }
}

435. 无重叠区间

leetcode题目地址

和上题思路类似。本题是找到有重叠的区间,然后删除覆盖范围较大的那一个。先对区间进行排序,按照区间起始位置升序排序,若起始位置相同,则按照结束位置升序排序。

然后遍历数组,若后一个区间的起始位置小于前一个区间的结束位置(等于不算重叠),则两区间有重叠,删除后面的区间。这里的删除不是物理删除,是逻辑删除,更新后一个区间的结束区间即可,后一个区间的结束位置等于前一个区间的结束位置和后一个区间结束位置较小的那个。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)

java 复制代码
// java
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            if(a[0] == b[0]){
                return Integer.compare(a[1], b[1]);
            }
            return Integer.compare(a[0], b[0]);
        });
        int cnt = 0;
        for(int i=1; i<intervals.length; i++){
            // 重叠
            if(intervals[i][0] < intervals[i-1][1]){
                cnt++;
                intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);
            }
        }
        return cnt;
    }
}

*763. 划分字母区间

leetcode题目地址

笨拙版

先统计字符串中每个字母的出现次数。

记录目前子串中出现的字母,若子串中的字母均已访问过则切分为一个子串记录长度。

使用map记录子串中的字母以及对应字母的剩余个数,当字母剩余0个时即当前字母访问结束从map中移除。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

java 复制代码
// java
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] chars = new int[26];
        for(int i=0; i<s.length(); i++){
            chars[s.charAt(i) - 'a']++;
        }
        List<Integer> result = new ArrayList<>();
        Map<Character, Integer> hash = new HashMap<>();
        int start = 0;
        
        for(int i=0; i<s.length(); i++){
            chars[s.charAt(i) - 'a']--;
            if(hash.containsKey(s.charAt(i))) hash.put(s.charAt(i), hash.get(s.charAt(i))-1);
            else hash.put(s.charAt(i), chars[s.charAt(i) - 'a']);
            if(hash.get(s.charAt(i)) == 0) hash.remove(s.charAt(i));
            
            if(hash.isEmpty()){
                result.add(i-start+1);
                start = i+1;
            }
        }
        return result;
        
    }
}

进阶版

先统计每个字符的最后出现的位置,当访问字符串时,若已到达子串中所有字符的最后位置,则记录当前子串长度。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

java 复制代码
// java
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] hash = new int[26];
        for(int i=0; i<s.length(); i++){
            // 记录最后出现的位置
            hash[s.charAt(i) - 'a'] = i;
        }
        List<Integer> result = new ArrayList<>();
        
        int start = 0;
        int end = 0;
        for(int i=0; i<s.length(); i++){
            end = Math.max(end, hash[s.charAt(i) - 'a']);
            if(i == end){
                // 到达当前子串最右端
                result.add(end-start+1);
                start = i+1;
            }
        }
        return result;
        
    }
}
相关推荐
.格子衫.4 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python4 小时前
生活中的“小智慧”——认识算法
学习·算法·生活
sali-tec5 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董5 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员5 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏6 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time6 小时前
二分搜索(Binary Search)
算法
王哈哈^_^7 小时前
【数据集】【YOLO】【目标检测】口罩数据集,口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
dragoooon348 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
py有趣8 小时前
LeetCode算法学习之移除元素
java·数据结构·算法