首页 > 其他分享 >LeetCodeHot100 数组 53. 最大子数组和 56. 合并区间 238. 除自身以外数组的乘积 41. 缺失的第一个正数

LeetCodeHot100 数组 53. 最大子数组和 56. 合并区间 238. 除自身以外数组的乘积 41. 缺失的第一个正数

时间:2024-03-26 16:23:17浏览次数:24  
标签:nums int LeetCodeHot100 56 length 数组 res dp

53. 最大子数组和
https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&envId=top-100-liked

public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 1] + nums[i] , nums[i]);
        }
        int max = dp[0];
        for (int i = 1; i < dp.length; i++) {
            max = dp[i] > max ? dp[i] : max;
        }
        return max;
    }

总结:动态规划,dp数组的含义是当前数字结尾的最大和,每次去比到上一个数的最大和+自己 跟自己谁大,谁大用谁。最后再求最大值。
ps:既然是以当前数字结尾,那就必须带上当前数字。
56. 合并区间
https://leetcode.cn/problems/merge-intervals/description/?envType=study-plan-v2&envId=top-100-liked

public int[][] merge(int[][] intervals) {
        int len = intervals.length;
        // 按照起点排序
        Arrays.sort(intervals,(o1, o2) -> o1[0] - o2[0]);
        // 也可以使用 Stack,因为我们只关心结果集的最后一个区间
        List<int[]> res = new ArrayList<>();
        res.add(intervals[0]);
        for (int i = 1; i < len; i++) {
            int[] curInterval = intervals[i];

            // 每次新遍历到的列表与当前结果集中的最后一个区间的末尾端点进行比较
            int[] peek = res.get(res.size() - 1);

            if (curInterval[0] > peek[1]) {
                res.add(curInterval);
            } else {
                // 注意,这里应该取最大
                peek[1] = Math.max(curInterval[1], peek[1]);
            }
        }
        return res.toArray(new int[res.size()][]);
    }

总结:先排序,让左边界从小到大排序,再循环看每个区间,去看是否需要跟前一个区间合并。
189. 轮转数组
https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-100-liked

public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }
    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

总结:首先k对数组长度取余才是真正要动的次数,很关键,之后就是大反转。两次小反转
238. 除自身以外数组的乘积
https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-100-liked

public int[] productExceptSelf(int[] nums) {
        int length = nums.length;
        int[] s1 = new int[length];
        int[] s2 = new int[length];
        int[] res = new int[length];
        s1[0] = nums[0];
        for (int i = 1; i < length; i++) {
            s1[i] = s1[i - 1] * nums[i];
        }
        s2[length - 1] = nums[length - 1];
        for (int i = length -2; i >= 0; i--) {
            s2[i] = s2[i + 1] * nums[i];
        }
        for (int i = 0; i < length; i++) {
            if (i == 0){
                res[i] = s2 [i + 1];
            }else if (i == length - 1){
                res[i] = s1[i - 1];
            }else {
                res[i] = s1[i - 1] * s2[i + 1];
            }
        }
        return res;
    }

总结:S1是前缀积,S2是后缀积,之后在遍历。
41. 缺失的第一个正数
https://leetcode.cn/problems/first-missing-positive/description/?envType=study-plan-v2&envId=top-100-liked

public int firstMissingPositive(int[] nums) {
        int length = nums.length;
        for (int i = 0; i < length; i++) {
            while (nums[i] > 0 && nums[i] <= length && nums[nums[i] - 1] != nums[i]){
                swap(nums,nums[i] - 1,i);
            }
        }
        for (int i = 0; i < length; i++) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        return length + 1;
    }
    public void swap(int[] nums, int index1, int index2) {
        int temp = nums[index1];
        nums[index1] = nums[index2];
        nums[index2] = temp;
    }

总结:先处理数组,把数组的每个值放到相应位置 ,例如5放到索引为4的位置,再去遍历数组 发现位置不对的数,就返回;

标签:nums,int,LeetCodeHot100,56,length,数组,res,dp
From: https://www.cnblogs.com/jeasonGo/p/18096939

相关文章

  • 【IT老齐056】日千万级订单系统的高可用、高性能架构
    【IT老齐056】日千万级订单系统的高可用、高性能架构原始场景避免丢单关键逻辑不要使用读写分离的查询方式,避免从库同步延迟造成订单查询异常关键逻辑也不要使用缓存来进行订单的查询订单补偿不要粗暴地使用消息队列的方式,避免中间件引发的订单丢失接收消息处理......
  • 第三篇-Javascript数组
    什么是数组数组指一组有序数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。可以通过new关键字来创建数组。Javascript访问数组1、通过索引访问单个元素:letarr=[1,2,3,4,5];console.log(arr[0]);//输出1console.log(arr[2]);//输出3cons......
  • C语言数组
    概念一组相同类型元素的集合定义intarr【10】={1,2,3,4,5,6,7,8,9};//定义一个整型数组,最多放10个元素。数组的下标数组的每个元素都有一个下标,下标从0开始,且数组通过下标来访问。如下面程序intmain(){    intarr【10】={10,11,12,13,14,15,16,17,18,19};    printf......
  • Java-数组
    在Java中,数组是一种基本的数据结构,用于存储固定大小的同类型元素集合。以下是Java中数组的相关知识:数组的声明数组声明包括指定数组的类型和数组的名称。数组类型可以是任何基本数据类型或对象类型。int[]numbers;//声明一个整型数组String[]names;//声明一个字符......
  • 写模板,树状数组。
    1根据长度初始化,单点更新,区间查询。可以查询区间和(输入为位置+数值),可以查询区间内频次(输入为数值+频次1)。2根据输入数据线性初始化。3根据输入数据频次线性初始化,区间更新,单点查询。根据差分后的数组求前缀和(单点查询)。classFenwickTree{public:FenwickTree(......
  • 洛谷 P3374 【模板】树状数组 1
    classFenwickTree{public:FenwickTree(intsz):sz_(sz){ft_.resize(sz_);}FenwickTree(vector<longlong>&f){sz_=int(f.size());ft_.assign(sz_,0);for(inti=1;i<sz_;++i){ft......
  • 洛谷 P3368 【模板】树状数组 2
    classFenwickTree{public:FenwickTree(intsz):sz_(sz){ft_.resize(sz_);}FenwickTree(vector<longlong>&f){sz_=int(f.size());ft_.assign(sz_,0);for(inti=1;i<sz_;++i){ft......
  • js数组对象合并
    合并数组,对象合并(Array/Objectmerging)合并数组和对象合并则是指将两个数组或对象合并为一个新的数组或对象。在JavaScript中,我们可以使用不同的方法来实现这种合并,比如使用 concat 方法来合并数组,或者使用对象展开运算符(spreadoperator)来合并对象。例如,合并两个数组可以这样......
  • 并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路
    并查集模板f数组要初始化autofind(autox){if(f[x]==x)returnx;elsereturnf[x]=find(f[x])路径压缩,同一条路上都归到一个点上}voidunionset(autoa,autob){f[find(a)]=find(b);auto会自动适配数据类型} P3367【模板】并查集题目描述如题......
  • 复制(拷贝)数组的方法
    1.Arrays类的copyOf()方法2.Arrays类的copyOfRange()方法3.System类的arraycopy()方法4.Object类的clone()方法(1)copyOf()方法是以指定的长度复制原数组,然后返回一个新数组,如果长度超过原数组,会以数组类型的默认值进行填充(2)copyOfRange()方法则将指定原数组的指定长度范......