《LeetCode热题100》---<5.普通数组篇六道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题

第一道:最大子数组和(中等)

第二道:合并区间(中等)

第一道:最大子数组和(中等)

法一:贪心算法

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        int cur_sum  = nums[0];
        int max_sum = cur_sum;

        for(int i = 1; i <len; i++){
            cur_sum = Math.max(nums[i],cur_sum+nums[i]);
            max_sum = Math.max(cur_sum,max_sum);
        }
        
        return max_sum;
    }
}

1.将当前和与最大和设置为数组第一个元素

2.从第二个元素开始遍历数组元素。

  • 令当前和等于 当前元素当前和+当前元素 的最大值
  • 令最大和等于 当前和最大和 的最大值

3.返回最大和,即为答案。

法二:动态规划

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int pre = 0, maxAns = nums[0];
        for (int x : nums) {
            pre = Math.max(pre + x, x);
            maxAns = Math.max(maxAns, pre);
        }
        return maxAns;
    }
}

这个动态规划的答案实际上和上面讲的贪心算法的答案是一样的。

第二道:合并区间(中等)

方法一:排序

java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length == 0) {
            return new int[0][2];
        }
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0] - interval2[0];
            }
        });
        List<int[]> merged = new ArrayList<int[]>();
        for (int i = 0; i < intervals.length; ++i) {
            int L = intervals[i][0], R = intervals[i][1];
            if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
                merged.add(new int[]{L, R});
            } else {
                merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
            }
        }
        return merged.toArray(new int[merged.size()][]);
    }
}
  • 检查空数组 :如果输入的区间数组 intervals 为空,则返回一个空的二维数组。
  • 排序区间:将所有区间按起始位置进行排序,确保按从左到右的顺序处理区间。
  • 合并区间
    • 初始化一个列表 merged,用于存储合并后的区间。
    • 遍历每个区间,获取当前区间的起始位置 L 和结束位置 R
    • 如果 merged 为空,或者当前区间的起始位置 L 大于 merged 中最后一个区间的结束位置,则直接将当前区间加入 merged
    • 否则,将当前区间与 merged 中最后一个区间合并,更新最后一个区间的结束位置为二者的最大值。
  • 返回结果 :将 merged 列表转换为二维数组并返回。

通过先对区间进行排序,然后逐一合并重叠区间,最终返回合并后的区间数组。

相关推荐
Matlab程序猿小助手27 分钟前
【MATLAB源码-第303期】基于matlab的蒲公英优化算法(DO)机器人栅格路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab·机器人·kmeans
不爱编程的小九九27 分钟前
小九源码-springboot097-java付费自习室管理系统
java·开发语言·spring boot
CoderIsArt33 分钟前
CORDIC三角计算技术
人工智能·算法·机器学习
立志成为大牛的小牛34 分钟前
数据结构——二十九、图的广度优先遍历(BFS)(王道408)
数据结构·数据库·学习·程序人生·考研·算法·宽度优先
Alex艾力的IT数字空间36 分钟前
基于PyTorch和CuPy的GPU并行化遗传算法实现
数据结构·人工智能·pytorch·python·深度学习·算法·机器学习
仰泳的熊猫1 小时前
LeetCode:51. N 皇后
数据结构·c++·算法·leetcode
独自破碎E1 小时前
LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复
java·算法·leetcode
程语有云1 小时前
生产事故-Caffeine缓存误用之临下班的救赎
java·缓存·caffeine·阻塞·log·生产事故
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
CodeCraft Studio1 小时前
国产化Word处理控件Spire.Doc教程:用Java实现TXT文本与Word互转的完整教程
java·c#·word·spire.doc·word文档转换·txt转word·word转txt