前缀和——从LeetCode题海中总结常见套路

news2024/11/30 0:51:41

目录

前缀和定义

截断前缀和DP:LeetCode53.最大子序和

经典左右指针:LeetCode209.长度最小的子数组

暴力求解:超时

优雅的双指针写法一:

优雅的双指针写法二:

LeetCode.1588.所有奇数长度子数组的和

手速题:LeetCode.1732.找到最高海拔


 

前缀和定义

对于一个给定的数列 A, 它的前缀和数列S 是通过递推能求出来得部分和,即数列A中某个下标区间内的数的和,可以表示为前缀和相减的形式。                             sum[l,r] = \sum_{i=l}^{r} A[i] = S[r] - S[l-1]    

注:前缀和的定义非常简单,但是其变形的却比较难以把握,其中的精髓思想可以理解为双指针(左右指针),其核心关键词的是差分、累积、动态规划。具体的题目变化多端,其中不乏很多很经典的LeetCode镇店之宝,下面具体来看一看。

截断前缀和DP:LeetCode53.最大子序和

LeetCode DP 绝对经典之一,也是剑指offer里面经典题目之一,不多说了,看注释。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum = nums[0];
        int maxnum = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            // 前缀和变形,选取前面所有的和或者从当前下标开始的和
            sum = max(nums[i], sum + nums[i]);
            // DP思想,动态维护最大的和
            maxnum = max(maxnum, sum);
        }
        return maxnum;
    }
};

经典左右指针:LeetCode209.长度最小的子数组

暴力求解:超时

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty())
            return 0;
        for (int i = 1; i < nums.size(); i++) 
            nums[i] += nums[i - 1];
        // for (auto elem : v)
        //     cout << elem << " ";
        int ans = nums.size();
        for (int i = 0; i < nums.size() - 1; i++) {
            for (int j = i + 1; j < nums.size(); j++) {
                if ((nums[j] - nums[i]) >= s)
                    ans = min((j - i), ans);
            }
        }
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] >= s && i < ans)
                ans = i + 1;
        }
        if (ans == nums.size() && nums[nums.size() - 1] < s)
            return 0;
        return ans;
    }
};

优雅的双指针写法一:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty())
            return 0;
        int i = 0;
        int sum = 0, ans = 0;
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            while (sum >= s) {
                ans = ans == 0 ? j - i + 1 : min(ans, j - i + 1);
                sum -= nums[i++];
            }
        }
        return ans;
    }
};

优雅的双指针写法二:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty())
            return 0;
        int ans = INT_MAX;
        int sum = 0, i = 0, j = 0;
        while (j < nums.size()) {
            sum += nums[j];
            while (sum >= s) {
                ans = min(ans, j - i + 1);
                sum -= nums[i++];
            }
            j++;
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

LeetCode.1588.所有奇数长度子数组的和

class Solution {
public:
    int sumOddLengthSubarrays(vector<int>& arr) {
        // 前缀和
        int ans = 0;
        int length = arr.size();
        int prefix[length + 1];
        for (int i = 0; i < length; i++) {
            prefix[i+1] = prefix[i] + arr[i];
        }
        // 每次间隔两个向前取前缀和保证都是奇数数组
        for (int i = 0; i < length; i++) {
            for (int j = i; j >= 0; j-=2) {
                ans += (prefix[i+1] - prefix[j]);
            }
        }
        return ans;
    }
};

手速题:LeetCode.1732.找到最高海拔

class Solution {
public:
    int largestAltitude(vector<int>& gain) {
        // 前缀和,然后找到最大值点
        int ans = gain[0];
        for (int i = 1; i < gain.size(); i++) {
            gain[i] += gain[i - 1];
            ans = max(ans, gain[i]);
        }
        // 因为从海拔为0的点开始的,所以不可能是负数
        if (ans < 0) {
            return 0;
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2188948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot系列--web相关知识探索三

一、前言 web相关知识探索二中研究了请求是如何映射到具体接口&#xff08;方法&#xff09;中的&#xff0c;本次文章主要研究请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、…

[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解

[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解 前言: 古人云: 得卧龙者&#xff0c;得天下。 然在当今大语言模型流行的时代&#xff0c;同样有一句普世之言: 会微调技术者&#xff0c;得私域大模型部署之道&#xff01; 在众多微调技术中&#xff0c;LoRA (…

单细胞scDist细胞扰动差异分析学习

scDist通过分析不同状态下细胞的距离来找到差异最大的细胞亚群(见下图的A)&#xff0c;然后再分析每一个细胞亚群的PCA通过线性的混合模型并结合最终的系数去预估不同干预方式下细胞群之间的距离。 Augur是通过对每一个细胞进行AUC评分并排序最终找到扰动最佳的细胞群&#xf…

等额本金和等额本息是什么意思?

等额本金和等额本息是两种常见的贷款还款方式&#xff0c;它们各自有着不同的特点和适用场景。下面我将用通俗易懂的语言来解释这两种还款方式&#xff1a; 等额本金 定义&#xff1a;等额本金指的是在贷款期限内&#xff0c;每月偿还相同数额的本金&#xff0c;而利息则随着剩…

FPGA远程烧录bit流

FPGA远程烧录bit流 Vivado支持远程编译并下载bit流到本地xilinx开发板。具体操作就是在连接JTAG的远程电脑上安装hw_server.exe。比如硬件板在实验室或者是其他地方&#xff0c;开发代码与工程在本地计算机&#xff0c;如何将bit流烧录到实验室或者远程开发板&#xff1f; vi…

Socket套接字(客户端,服务端)和IO多路复用

Socket套接字&#xff08;客户端&#xff0c;服务端&#xff09; 目录 socket是什么一、在客户端1. 创建套接字2. 设置服务器地址3. 连接到服务器4. 发送数据5. 接收数据6. 关闭连接 二、内核态与用户态切换三、系统调用与上下文切换的关系四、在服务端1. 创建 Socket (用户态…

【Linux】进程地址空间(初步了解)

文章目录 1. 奇怪的现象2. 虚拟地址空间3. 关于页表4. 为什么要有虚拟地址 1. 奇怪的现象 我们先看一个现象&#xff1a; 为什么父子进程从“同一块地址中”读取到的值不一样呢&#xff1f; 因为这个地址不是物理内存的地址 &#xff0c;如果是物理内存的地址是绝对不可能出…

C++【类和对象】(友元、内部类与匿名对象)

文章目录 1.友元2.内部类3.匿名对象结语 1.友元 友元提供了⼀种突破类访问限定符封装的方式&#xff0c;友元分为&#xff1a;友元函数和友元类&#xff0c;在函数声明或者类声明的前面加friend&#xff0c;并且把友元声明放到⼀个类的里面。外部友元函数可访问类的私有和保护…

【安全科普】从“微信文件助手隐私泄漏”看社交平台网络安全

随着互联网技术的飞速发展&#xff0c;社交平台已经成为了人们日常生活中不可或缺的一部分。人们通过社交平台与亲朋好友保持联系&#xff0c;分享生活点滴&#xff0c;获取资讯信息。然而&#xff0c;与此同时&#xff0c;社交平台上的网络安全风险也日益凸显。近期&#xff0…

简单的a+b-C语言

1.问题&#xff1a; 输入两个整数a和b&#xff0c;计算ab的和。 2.解答&#xff1a; scanf()函数是通用终端格式化输入函数&#xff0c;它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 scanf()函数返回值分为3种&…

分布式学习02-CAP理论

文章目录 CAP三指标一致性可用性分区容错性 CAP不可能三角P存在的必要性CP理论AP理论 CAP理论对分布式系统的特性做了高度抽象&#xff0c;将其抽象为一致性、可用性、分区容错性。 并对特征间的冲突做了总结&#xff1a;CAP不可能三角。 CAP三指标 一致性&#xff08;Consis…

【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解

目录 1、FileChannel (1&#xff09;获取 FileChannel (2&#xff09;读取文件 (3&#xff09;写入文件 (4&#xff09;关闭通道 (5&#xff09;当前位置与文件大小 (6&#xff09;强制写入磁盘 2、两个 FileChannel 之间的数据传输 (1&#xff09;使用 transferTo()…

HTML的修饰(CSS) -- 第三课

文章目录 前言一、CSS是什么&#xff1f;二、使用方式1. 基本语法2. 引入方式1.行内式2.内嵌式3. 链入式 3. 选择器1. 标签选择器2.类选择器3. id选择器4. 通配符选择器 4. css属性1. 文本样式属性2. 文本外观属性 5. 元素类型及其转换1. 元素的类型2. 元素的转换 6.css高级特性…

isinstance()学习

aa {} if isinstance(aa,dict):print("是")aa 2 if isinstance(aa,dict):print("是")aa 2 if isinstance(aa,int):print("是")aa [] if isinstance(aa,list):print("list")aa [1,2,3] if isinstance(aa,list):print("list"…

模拟算法(4)_外观数列

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 模拟算法(4)_外观数列 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目链…

选择排序:直接选择排序、堆排序

目录 直接选择排序 1.选择排序的基本思想 2.直接选择排序的基本思想 3.直接插入排序的代码思路步骤 4.直接选择排序代码 5.直接选择排序的特性总结 堆排序 一、排升序&#xff0c;建大堆 1.利用向上调整函数建大堆 1.1.建立大堆的思路 1.2.以下是具体步骤&#xff1a…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第一章节&…

Solidity 存储和内存管理:深入理解与高效优化

在 Solidity 中&#xff0c;存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取&#xff0c;而这些操作对 gas 的消耗有很大影响。因此&#xff0c;理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…

pytorch之梯度累加

1.什么是梯度&#xff1f; 梯度可以理解为一个多变量函数的变化率&#xff0c;它告诉我们在某一点上&#xff0c;函数的输出如何随输入的变化而变化。更直观地说&#xff0c;梯度指示了最优化方向。 在机器学习中的作用&#xff1a;在训练模型时&#xff0c;我们的目标是最小…

day2网络编程项目的框架

基于终端的 UDP云聊天系统 开发环境 Linux 系统GCCUDPmakefilesqlite3 功能描述 通过 UDP 网络使服务器与客户端进行通信吗&#xff0c;从而实现云聊天。 Sqlite数据库 用户在加入聊天室前&#xff0c;需要先进行用户登录或注册操作&#xff0c;并将注册的用户信息&#xf…