最近不是流感了嘛,身体状态不是很好,但这也不是不写博客的理由,干就完了,兄弟们
目录
🌿寻找数组的中心下标
🧊题目链接
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;
}
}
完结了🧊🌿🍋🟩