力扣hot100-普通数组

文章目录

题目:最大子数组和

原题链接:最大子数组和

方法1 动态规划

java 复制代码
public class T53 {
    //动态规划
    public static int maxSubArray(int[] nums) {
        if (nums.length == 0) return 0;

        int[] dp = new int[nums.length]; // dp[i] 表示以 nums[i] 结尾的最大子数组和
        dp[0] = nums[0]; // 初始化状态

        int res = dp[0]; // 初始化最大子数组和

        // 动态规划状态转移
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);  //状态转移方程
            res = Math.max(res, dp[i]);
        }

        return res;
    }

    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println(maxSubArray(nums)); // 输出: 6
    }
}

方法2

方法二可能不容易想到

java 复制代码
public class T53 {
    public int maxSubArray(int[] nums) {
        // 初始化为int类型最小值
        int res = nums[0];
        int tempTotal = 0;
        for (int i = 0; i < nums.length; i++) {
            tempTotal += nums[i];
            // 记录最大数值
            res = Math.max(tempTotal, res);
            if (tempTotal < 0) {
                // 如果和小于0,就重置为0,因为任何数加上一个负数一定小于当前数值
                tempTotal = 0;  //0加任何数都等于任何数
            }
        }
        return res;
    }

    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println(maxSubArray(nums)); // 输出: 6
    }
}

题目:合并区间

原题链接:合并区间

题解

java 复制代码
    public static int[][] merge(int[][] intervals) {
        if (intervals.length == 0) {
            return new int[0][2];
        }
        // 可使用Lambda表达式
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0]-interval2[0];
            }
        });

        List<int[]> merged = new ArrayList<>();
        for (int[] interval : intervals) {
            int L = interval[0], R = interval[1];
            // 如果merged列表为空,或者当前区间与上一个区间不重叠,直接添加当前区间
            if (merged.isEmpty() || 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);
            }
        }
        //List.toArray(T[] a) 方法将列表中的所有元素存储到指定类型的数组中
        return merged.toArray(new int[merged.size()][]);
    }

核心:

如果新区间的起始值大于 merged 列表中最后一个区间的结束值,则直接将新的区间添加到 merged 列表中;否则,更新 merged 列表中最后一个区间的结束值。

  • 排序区间: 确保区间按照起始值从小到大排列,方便后续合并操作。
  • 遍历和合并: 遍历排序后的区间数组,使用一个 merged 列表来存储合并后的区间。如果当前区间与前一个区间不重叠,直接添加到 merged 列表;如果重叠,更新 merged 列表中最后一个区间的结束值。

❤觉得有用的可以留个关注~~❤

相关推荐
逆境不可逃10 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法
Coder-magician10 小时前
《代码随想录》刷题打卡day31:动态规划-背包问题part02
算法·动态规划
薛定e的猫咪10 小时前
从因果视角解决多智能体协作:细读 SCIC 算法
算法
Forever Nore10 小时前
LeetCode 14 最长公共前缀 - 纵向扫描
linux·服务器·leetcode
c2385610 小时前
《算法武林谱:四大排序神功与二分寻宝术全解》
数据结构·算法·排序算法
圣保罗的大教堂10 小时前
leetcode 3090. 每个字符最多出现两次的最长子字符串 简单
leetcode
一米阳光866111 小时前
软考(中级)软件设计师核心笔记(9)算法——时间复杂度与空间复杂度、查找算法、排序算法
笔记·算法·职场发展·软考·软件设计师·中级职称
Mem0rin11 小时前
二分查找:左右边界
数据结构·算法
大明者省20 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7981 天前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法