64,172
社区成员




枚举长度之后枚举第一个下标和最后一个下标,加起来即可
int sumOddLengthSubarrays(int* arr, int arrSize){
int ans = 0;
for(int l = 0; l < arrSize; l+=2){
for(int i = 0; i < arrSize - l; ++i){
for(int j = i; j < arrSize && j <= i + l; ++j){
ans += arr[j];
}
}
}
return ans;
}
可以只枚举开始和结束的下标,每次增添一个数的时候把之前的sum加入ans就不用重复枚举前面的(这个时候是按开始的下标顺序枚举的)
int sumOddLengthSubarrays(int* arr, int arrSize){
int ans = 0;
for(int i = 0; i < arrSize; ++i){
int sum = 0;
for(int j = i; j < arrSize; ++j){
sum += arr[j];
if((j - i + 1) & 1){
ans += sum;
}
}
}
return ans;
}
双指针,记录最先到达target的下标
int getMinDistance(int* nums, int numsSize, int target, int start){
int l = start, r = start;
int ans = INT_MAX;
while(1){
if(nums[l] == target){
ans = start - l;
break;
}
else if(nums[r] == target){
ans = r - start;
break;
}
else{
if(l > 0) --l;
if(r < numsSize - 1) ++r;
}
}
return ans;
}
int* decrypt(int* code, int codeSize, int k, int* returnSize){
int* ret = (int*)malloc(sizeof(int) * codeSize);
for(int i = 0; i < codeSize; ++i){
ret[i] = 0;
if(k >= 0){
for(int j = 1; j <= k; ++j){
if(i + j < codeSize) ret[i] += code[i + j];
else ret[i] += code[(i + j) % codeSize];
}
}
else{
for(int j = -1; j >= k; --j){
if(i + j >= 0) ret[i] += code[i + j];
else ret[i] += code[i + j + codeSize];
}
}
}
*returnSize = codeSize;
return ret;
}
bool canFormArray(int* arr, int arrSize, int** pieces, int piecesSize, int* piecesColSize){
int map[101] = {0};
for(int i = 0; i < arrSize; ++i){
map[arr[i]] = i + 1;//构建地址映射,因为数组中每个数都不同且大于0,可以保证这个值就是这个数
//的地址下标加1
}
for(int i = 0; i < piecesSize; ++i){
for(int j = 0; j < piecesColSize[i]; ++j){
if(map[pieces[i][j]] == 0){
return false;
}
if(j > 0){
int connect = map[pieces[i][j]] - map[pieces[i][j - 1]];
//这两个数相减就是检查这两个数在arr中是否相邻
if(connect != 1){
return false;
}
}
}
}
return true;
}