1588. 所有奇数长度子数组的和
思路
基础方法:
- 前缀和,
- 也可普通数组三次循环遍历
前缀和
<1>先预处理一个前缀和,前缀和每一位的数值,代表数组第N-1个数的和
<2>开始按照题意进行两次遍历
第一次控制计算的起始点
第二次控制计算的元素个数,因为是奇数长度,所以len+2
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int n = arr.length;
int[] prefixNum = new int[n+1];
//<1>
for(int i=0;i<n;++i){
prefixNum[i+1] = prefixNum[i]+arr[i];
}
int totalSum=0;
for(int start=0;start<=n;++start){
for(int len =1;start+len<=n;len+=2){
int end = start+len-1;
totalSum += prefixNum[end+1]-prefixNum[start];
}
}
return totalSum;
}
}
时间复杂度
空间复杂度
暴力三循环
三个循环
最外层循环控制起始位置
第二个控制,需要计算连续元素的个数,
第三个执行计算
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int n = arr.length;
int sum=0;
for(int start=0;start <n;++start){
for(int length=1;start+length<=n;length+=2){
int end = start+length-1;
for(int j=start;j<=end;++j){
sum+=arr[j];
}
}
}
return sum;
}
}
1848. 到目标元素的最小距离
一层循环,每次都判断下遍历到的数2,是不是目标值,是则对比i和start的差值绝对值,取最小值
class Solution {
public int getMinDistance(int[] nums, int target, int start){
int n = nums.length;
int minIndex = 99999;
for(int i=0;i<n;++i){
if(nums[i]==target){
minIndex = Math.min(minIndex,Math.abs(i-start);
}
}
return minIndex;
}
}