day36 贪心 | 435,763

  •  435. 无重叠区间 
    • 贪心: 处理重叠问题,如果重叠了 去除区间大的
  •  763.划分字母区间 
    • 1. 统计每个字母最后出现的位置
    • 2. 当遍历到这个位置时,输出范围
package algor.trainingcamp;

import java.util.Arrays;

/**
 * @author lizhe
 * @version 1.0
 * @description: 给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/non-overlapping-intervals
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 * 贪心: 处理重叠问题,如果重叠了 去除区间大的
 * @date 2023/5/10 07:56
 */
public class LeetCode435 {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a,b)-> {
            return Integer.compare(a[0],b[0]);
        });

        int preRight = intervals[0][1];
        int remove = 0;

        for(int i = 1;i < intervals.length;i++){
            //区间重叠,需要移除右边界大的
            if(preRight > intervals[i][0]){
                preRight = Math.min(intervals[i][1], preRight);
                remove++;
            }else{
                preRight = intervals[i][1];
            }
        }

        return remove;
    }
}
package algor.trainingcamp;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lizhe
 * @version 1.0
 * @description:
 * 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,
 * 同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
 * 示例:
 *
 * 输入:S = "ababcbacadefegdehijhklij"
 * 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
 * 提示:
 *
 * S的长度在[1, 500]之间。
 * S只包含小写字母 'a' 到 'z' 。
 * @date 2023/5/10 08:10
 *
 * 1. 统计每个字母最后出现的位置
 * 2. 当遍历到这个位置时,直接输出
 */
public class LeetCode763 {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new ArrayList<>();

        int[] dic = new int[26];
        //统计最后出现的位置
        for(int i = 0;i < s.length();i++){
            dic[s.charAt(i) - 'a'] = i;
        }

        int left = 0;
        int right = 0;

        for(int i = 0;i < s.length();i++){
            right = Math.max(right, dic[s.charAt(i) - 'a']);
            if(i == right){
                res.add(right - left + 1);
                left = right + 1;
            }
        }

        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值