算法-前缀和

最近不是流感了嘛,身体状态不是很好,但这也不是不写博客的理由,干就完了,兄弟们

目录

🌿寻找数组的中心下标

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿除自身以外数组的1乘积

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿和为k的子数组

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿和可被k整除的子数组

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿连续数组

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿矩阵区域和

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码


🌿寻找数组的中心下标

🧊题目链接

https://leetcode.cn/problems/find-pivot-index/description/

🧊题目描述

🧊解题思路

🧊解题代码

java 复制代码
class Solution {
    public int pivotIndex(int[] nums) {
        int n=nums.length;
        int[] front=new int[n];//前缀和数组
        int[] behind=new int[n];//后缀和数组
        front[0]=0;//特别处理
        for(int i=1;i<n;i++){//预处理前缀和数组
            front[i]=front[i-1]+nums[i-1];
        }
        behind[n-1]=0;//特别处理
        for(int i=n-2;i>=0;i--){//预处理后缀和数组
            behind[i]=behind[i+1]+nums[i+1];
        }
        int ret=-1;
        int k=0;
        while(k<n){
            if(front[k]==behind[k]){
                ret=k;
                break;
            }
            k++;
        }
        return ret==-1?-1:ret;//ret为-1,就是while循环里没有符合条件的中心下标,返回-1即可
    }
}

🌿除自身以外数组的1乘积

🧊题目链接

https://leetcode.cn/problems/product-of-array-except-self/

🧊题目描述

🧊解题思路

🧊解题代码

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n=nums.length;
        int[] front=new int[n];//预处理前缀积数组
        int[] behind=new int[n];//预处理后缀积数组
        int[] arr=new int[n];
        front[0]=1;//处理特殊边界
        behind[n-1]=1;//处理特殊边界
        for(int i=1;i<n;i++){//循环条件注意下,我就是被它小恶心下了
            front[i]=front[i-1]*nums[i-1];
        }
        for(int j=n-2;j>=0;j--){//
            behind[j]=behind[j+1]*nums[j+1];
        }
        for(int k=0;k<n;k++){
            arr[k]=front[k]*behind[k];
        }
        return arr;
    }
}

🌿和为k的子数组

🧊题目链接

https://leetcode.cn/problems/subarray-sum-equals-k/?envType=problem-list-v2&envId=2cktkvj

🧊题目描述

🧊解题思路

话有点多,但字字句句全是我对于此题算法最原始逻辑的理解

🧊解题代码

java 复制代码
class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer,Integer> hash=new HashMap<Integer,Integer>();
        hash.put(0,1);//这是个完全连续区间等于key的情况,需要最先添加,因为如果没添加时,遍历第一个数时,hash表里是没有完全连续区间等于key的情况判断的,所不会计入ret结果
        int sum=0;
        int ret_count=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
            ret_count+=hash.getOrDefault((sum-k),0);//找寻所有正确的区间结果
            hash.put(sum,hash.getOrDefault(sum,0)+1);//这步很关键
           
        }
        return ret_count;
    }
}

🌿和可被k整除的子数组

🧊题目链接

https://leetcode.cn/problems/subarray-sums-divisible-by-k/submissions/681926898/

🧊题目描述

🧊解题思路

🧊解题代码

java 复制代码
class Solution {
    public int subarraysDivByK(int[] nums, int k) {
         HashMap<Integer,Integer> hash=new HashMap<Integer,Integer>();
        hash.put(0,1);//整个区间都可被整除
        int sum=0;
        int ret_count=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
            int r=(sum%k+k)%k;//优化取模
            ret_count+=hash.getOrDefault(r,0);//hash表里找结果
            hash.put(r,hash.getOrDefault(r,0)+1);维护hash表
        }
        return ret_count;
    }
}

🌿连续数组

🧊题目链接

https://leetcode.cn/problems/contiguous-array/

🧊题目描述

🧊解题思路

🧊解题代码

java 复制代码
class Solution {
    public int findMaxLength(int[] nums) {
        HashMap<Integer,Integer> hash=new HashMap<Integer,Integer>();
        int ret=0,sum=0;
        hash.put(0,-1);//预处理hash表,这个是整个区间为0区间的情况
        for(int i=0;i<nums.length;i++){
            sum+=(nums[i]==0?-1:1);//变化数值
            if(hash.containsKey(sum)){//第一次出现过,那就代表存在一个区间为0
                ret=Math.max(ret,i-hash.get(sum));//更新结果,不必加入hash表,因为第一次已经出现
            }else{//没出现,就需要加入hash表
                hash.put(sum,i);
            }
        }
        return ret;
    }
}

🌿矩阵区域和

🧊题目链接

https://leetcode.cn/problems/matrix-block-sum/description/

🧊题目描述

🧊解题思路

🧊解题代码

java 复制代码
class Solution {
    public int[][] matrixBlockSum(int[][] mat, int k) {
        int[][] dp=new int[mat.length+1][mat[0].length+1];//dp数组大小,横纵大小要超出原数组一个单位
        int[][] ret=mat;//用来存放结果集
        for(int i=1;i<dp.length;i++){//预处理前缀和dp数组
            for(int j=1;j<dp[0].length;j++){
                dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]+mat[i-1][j-1];
            }
        }
        for(int i=0;i<ret.length;i++){//处理真实ret结果集
            for(int j=0;j<ret[0].length;j++){//x1,y1,x2,y2后面+1是为了和dp数组对齐
                int x1=Math.max(0,i-k)+1,y1=Math.max(0,j-k)+1;//不能超过左上角区间范围
                int x2=Math.min(mat.length-1,i+k)+1,y2=Math.min(mat[0].length-1,j+k)+1;//不能超过右下角区间范围
                ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
            }
        }
        return ret;
    }
}

完结了🧊🌿🍋‍🟩

相关推荐
那个村的李富贵2 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿2 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
琹箐2 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia13 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了3 小时前
数据结构之树(Java实现)
java·算法
算法备案代理3 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.3 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦4 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总4 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68894 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法