前缀和第一弹

简介: 前缀和第一弹

前缀和->专门用于快速得出数组某一段连续区间的和O(1)

牛克.DP34【】前缀和

牛克的hasnext我一直开始的时候搞不明白

当发现同一类问题的时候,可以用同一类问题来解决。

while(in.hasnext)无关紧要,你要不要都可以

import java.util.Scanner;
 
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
            int n = in.nextInt();
            int q = in.nextInt();
            int []arr=new int[n+1];
            while(in.hasNext()){
            //预处理一个前缀和数组
            for(int i=1;i<=n;i++){
                arr[i]=in.nextInt();
            }
            long []dp=new long[n+1];
            for(int i=1;i<=n;i++){
                dp[i]=dp[i-1]+arr[i];
            }
            while(q>0){
                int l=in.nextInt();
                int m=in.nextInt();
                System.out.println(dp[m]-dp[l-1]);
                q--;
            }
            }
        }
    }

牛克.DP35二维前缀和

解法1.暴力解法->模拟

前缀和思想

1.预处理出来一个前缀和矩阵

2.使用前缀和矩阵

ij:表示从[1][1]到ij位置位置的这段区间前缀和

dp[i][j]=dp[i-1][j]+dp[i][j-1]+arr[i][j]-dp[i][j];

很难想,我认为是,反正我没有见过

结果的返回:

注意此时减去的c,应该是dp[x1-1][x2]因为[x1][x2]他这个点属于D的范围了,因为dpxy包含那个初始位置[x1][y1]的值是包含在内部的,

import java.util.Scanner;
 
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
       
            int m= in.nextInt();
            int n= in.nextInt();
            int q= in.nextInt();
            int[][]arr=new int[m+1][n+1];
            for (int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                 arr[i][j]=in.nextInt();
                }
            }
        long [][]dp=new long[m+1][n+1];
          for (int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
              dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+arr[i][j];
        }
          }
     while(q>0){
         int x=in.nextInt();
         int y=in.nextInt();
         int z=in.nextInt();
         int p=in.nextInt();
         System.out.println(dp[z][p]-dp[z][y-1]-dp[x-1][p]+dp[x-1][y-1]);
         q--;
  }
}
}

力扣724.寻找数组的中心下标

不要死记模版

如果全是前缀和,那么我们每次枚举一个中心下标,就要左边加一块,右边加一块

这样也很麻烦,所以推荐优秀的方法

前缀和与后缀和

class Solution {
      public static int pivotIndex(int[] nums) {
        //dp前缀和,0到i,区间的所有元素和
        int[] dp = new int[nums.length];
        dp[0] =nums[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = dp[i - 1] + nums[i];
        }
        //dp2后缀和数组,length到i的所有元素和
        int[] dp2 = new int[nums.length];
        dp2[nums.length - 1] =nums[nums.length-1];
 
        for (int i = nums.length - 2; i >= 0; i--) {
            dp2[i] = dp2[i + 1] + nums[i];
        }
        for (int i = 0; i < nums.length; i++) {
            //最后左右都会相等,所以最后无论你加不加这个i位置的数组都是可以的
            if (dp[i] == dp2[i]) {
                return i;
            }
        }
        return -1;
    }
 
}

方法2:与下一题的思想一致,都是dp[i]设定的含义是从0位置到i-1不包含它本身

 public static int pivotIndex(int[] nums) {
        //dp前缀和,0到i,区间的所有元素和
        int n=nums.length;
        int[] dp = new int[n];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = dp[i - 1]+ nums[i-1];
        }
        //dp2后缀和数组,length到i的所有元素和
        int[] dp2 = new int[n];
        for (int i = n - 2; i >=0; i--) {
            dp2[i] = dp2[i + 1] + nums[i+1];
        }
        for (int i = 0; i < n; i++) {
            //最后左右都会相等,所以最后无论你加不加这个i位置的数组都是可以的
            if (dp[i] == dp2[i]) {
                return i;
            }
        }
        return -1;
    }

力扣238.除自身以外数组的乘积

这个前缀和的思想一致,但是有不一样的地方

f[i]他是不包括自身的前缀乘积,g[i]那就是不包括自身的后缀乘积

f[i]:表示0-i-1区间内所有元素的乘积(f[i-1]是0-i-2位置)

f[i]=f[i-1]*nums[i-1];

g[i]:表示i+1到length-1(g[i+1]表示I+2到length-1位置

g[i]=g[i+1]*nums[i+1];

class Solution {
     public static int[] productExceptSelf(int[] nums) {
        int []f=new int[nums.length];
        int []g=new int[nums.length];
        int []k=new int[nums.length];
        f[0]=1;
        for(int i=1;i<nums.length;i++){
            //从1到i位置的乘积
           f[i]=f[i-1]*nums[i-1];
        }
        g[nums.length-1]=1;
        for(int j=nums.length-2;j>=0;j--){
           g[j]=g[j+1]*nums[j+1];
        }
        for(int i=0;i<nums.length-1;i++){
            k[i]=f[i]*g[i];
        }
        return k;
    }
}


相关文章
|
7天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1384 9
|
7天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1103 5
|
8天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
1013 12
|
2天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
313 118
|
5天前
|
存储 缓存 NoSQL
阿里云经济型e实例(ecs.e-c1m4.large)2核8G云服务器优惠活动价格及性能测评
阿里云经济型e实例(ecs.e-c1m4.large)2核8G配置,支持按使用流量或按固定带宽两种公网计费方式,搭配20G起ESSD Entry云盘,是主打高性价比的内存优化型入门选择。其核心特点是8G大内存适配轻量内存密集场景,计费模式灵活可控,既能满足个人开发者的复杂测试项目需求,也能支撑小微企业的基础业务运行,无需为闲置资源过度付费。以下从优惠活动价格、性能表现、适用场景及避坑要点四方面,用通俗语言详细解析。
220 152
|
2天前
|
机器学习/深度学习 人工智能 算法
炎鹊「Nexus Agent V1.0」:垂直领域AI应用的原生能力引擎
炎鹊AI「Nexus Agent V1.0」是垂直行业专属AI原生引擎,融合大模型、AIGA决策大脑、行业知识图谱与专属模型,打造“感知-决策-执行”闭环。支持21个行业低代码构建工具型、员工型、决策型AI应用,实现技术到业务价值的高效转化,推动AI从实验走向规模化落地。(239字)
229 1
|
3天前
|
人工智能 API 开发工具
OpenRouter 官方/官网中文版使用:官方入口、AI 大模型与 LLM API 调用(2026年全攻略)
随着 DeepSeek、Claude 3.5、Gemini 3 等高性能模型的爆发,单一模型已无法满足复杂的业务需求。本文将从架构设计角度,探讨 "Model Aggregation"(模型聚合)模式的必要性,深度解析 OpenRouter 协议的优势,并提供基于 Python SDK 的多模型接入与路由优化最佳实践。
240 3