Leetcode贪心算法

发布于:2025-08-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

题目:划分字母区间  题号:763

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> list = new LinkedList();
        int[] edge = new int[27];
        char[] chars = s.toCharArray();
        for(int i = 0; i <chars.length;i++){
            edge[chars[i] - 'a'] = i; 
        }
        int left = -1;
        int right = 0;
        for(int i = 0; i < chars.length;i++){
            right = Math.max(right, edge[chars[i] - 'a']);
            if(right == i){
                list.add(i - left);
                left = right ;
            }
        }
        return list;
    }
}

首先创建一个结果集用来存放我们想要的结果。然后用for循环进行遍历数组,用每一个数字和a进行相减得到他们的阿斯克码值这个值对i进行赋值。取到一个最大的数,这个就是我们的右区间,然后再更新左区间,继续遍历。

题目:合并区间  题号:56

class Solution {
    public int[][] merge(int[][] intervals) {
        LinkedList<int[]> result = new LinkedList<>();
        Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));
        result.add(intervals[0]);

        for(int i = 1; i < intervals.length;i++){
            if(intervals[i][0] <= result.getLast()[1]){
               int start = result.getLast()[0]; //左区间
               int end = Math.max(intervals[i][1],result.getLast()[1]); //右区间
               result.removeLast();
               result.add(new int[]{start, end});
            }else{
                result.add(intervals[i]);
            }
        }
        return result.toArray(new int[result.size()][]);
    }
}

这道题目的核心是进行区间的比较和判断,需要将i的右区间和i-1的左区间进行比较,如果有重合的部分那就进行合并,在这里使用的是result取出最后一个元素,方便后续处理。如果没有重合部分,那就那就添加到我们的result中。

题目:单调递增的数字 题号:738

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] arr = s.toCharArray();
        int flag = s.length();
        //从后遍历 利用flag进行标记
        for(int i = s.length() - 1; i > 0;i--){
            if(arr[i-1] > arr[i]){
                arr[i-1]--;
                flag = i;
            }
        }
        
        for(int i = flag;i < arr.length;i++){
            arr[i] = '9';
        }
        return Integer.parseInt(String.valueOf(arr));
    }
}

题目的核心是从后向左去遍历这个数字,当然在这之前需要将数组转换为字符数字。方便后续的遍。如果在遍历时发现前一期数字比后一个数字大的话就将他-1直到小于i位置的数字为止。然后标记flag,把flag后面的数字全部更新为9,这时才能达到最大的状态。


网站公告

今日签到

点亮在社区的每一天
去签到