算法-前缀和

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

目录

🌿寻找数组的中心下标

🧊题目链接

🧊题目描述

🧊解题思路

🧊解题代码

🌿除自身以外数组的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;
    }
}

完结了🧊🌿🍋‍🟩

相关推荐
Brduino脑机接口技术答疑1 小时前
脑机接口数据处理连载(六) 脑机接口频域特征提取实战:傅里叶变换与功率谱分析
人工智能·python·算法·机器学习·数据分析·脑机接口
豐儀麟阁贵1 小时前
9.3获取字符串信息
java·开发语言·前端·算法
程序员-King.1 小时前
day110—同向双指针(数组)—最多K个重复元素的最长子数组(LeetCode-2958)
算法·leetcode·双指针
做怪小疯子1 小时前
LeetCode 热题 100——二叉树——二叉树的右视图
算法·leetcode·职场和发展
Swift社区1 小时前
LeetCode 442 - 数组中重复的数据
算法·leetcode·职场和发展
努力学算法的蒟蒻1 小时前
day25(12.5)——leetcode面试经典150
算法·leetcode·职场和发展
xlq223222 小时前
23.二叉树搜索树(下)
数据结构·c++·算法
lzh200409192 小时前
【数据结构】二叉搜索树
数据结构·算法
c#上位机2 小时前
halcon图像膨胀—dilation1
图像处理·算法·c#·halcon