前缀和简单题
| int *leftRightDifference(int *nums, int numsSize, int *returnSize) { |
| int *res = (int *) malloc(sizeof(int) * numsSize); |
| *returnSize = numsSize; |
| int leftSum = 0, rightSum = 0; |
| |
| for (int i = 0; i < numsSize; ++i) rightSum += nums[i]; |
| for (int i = 0; i < numsSize; ++i) { |
| |
| rightSum -= nums[i]; |
| res[i] = abs(leftSum - rightSum); |
| |
| leftSum += nums[i]; |
| } |
| return res; |
| } |
| int sumOddLengthSubarrays(int *arr, int arrSize) { |
| int res = 0; |
| int *sum = (int *) calloc(arrSize + 1, sizeof(int)); |
| for (int i = 1; i <= arrSize; ++i) |
| sum[i] += sum[i - 1] + arr[i - 1]; |
| int gap = 1; |
| |
| |
| |
| while (gap <= arrSize) { |
| for (int i = gap; i <= arrSize; ++i) { |
| res += sum[i] - sum[i - gap]; |
| } |
| gap += 2; |
| } |
| return res; |
| } |
| |
| int sumOddLengthSubarrays(int *arr, int arrSize) { |
| int res = 0; |
| for (int i = 0; i < arrSize; ++i) { |
| int left = i + 1, right = arrSize - i; |
| int leftEven = (left + 1) >> 1, rightEven = (right + 1) >> 1; |
| int leftOdd = left >> 1, rightOdd = right >> 1; |
| res += (leftEven * rightEven + leftOdd * rightOdd) * arr[i]; |
| } |
| return res; |
| } |
| int largestAltitude(int *gain, int gainSize) { |
| int sum = 0; |
| int max = 0; |
| for (int i = 0; i < gainSize; ++i) { |
| sum += gain[i]; |
| if (max < sum) max = sum; |
| } |
| return max; |
| } |
| int pivotInteger(int n) { |
| int total = (1 + n) * n >> 1; |
| int prefixSum = total; |
| |
| for (int i = n; i >= 1; i--) { |
| |
| if (prefixSum == ((i + n) * (n - i + 1) >> 1)) return i; |
| prefixSum -= i; |
| } |
| return -1; |
| } |
| |
| int pivotInteger(int n) { |
| int total = n * (n + 1) / 2; |
| int x = sqrt(total); |
| return x * x == total ? x : -1; |
| } |
| |
| int pivotInteger(int n) { |
| switch (n) { |
| case 1: |
| return 1; |
| case 8: |
| return 6; |
| case 49: |
| return 35; |
| case 288: |
| return 204; |
| default: |
| return -1; |
| } |
| } |
| typedef struct { |
| int *sum; |
| } NumArray; |
| |
| |
| NumArray *numArrayCreate(int *nums, int numsSize) { |
| NumArray *numArray = (NumArray *) malloc(sizeof(NumArray)); |
| numArray->sum = (int *) calloc(numsSize + 1, sizeof(int)); |
| |
| for (int i = 1; i <= numsSize; ++i) { |
| numArray->sum[i] += numArray->sum[i - 1] + nums[i - 1]; |
| } |
| return numArray; |
| } |
| |
| int numArraySumRange(NumArray *obj, int left, int right) { |
| return obj->sum[right + 1] - obj->sum[left]; |
| } |
| |
| void numArrayFree(NumArray *obj) { |
| if (obj != NULL) { |
| free(obj); |
| obj = NULL; |
| } |
| } |
| int *runningSum(int *nums, int numsSize, int *returnSize) { |
| int *res = (int *) calloc(numsSize, sizeof(int)); |
| *returnSize = numsSize; |
| res[0] = nums[0]; |
| for (int i = 1; i < numsSize; ++i) |
| res[i] += res[i - 1] + nums[i]; |
| return res; |
| } |
| int minStartValue(int *nums, int numsSize) { |
| int prefixSum = 0; |
| int min = 101; |
| for (int i = 0; i < numsSize; ++i) { |
| prefixSum += nums[i]; |
| if (prefixSum < min) min = prefixSum; |
| } |
| if (min > 0) return 1; |
| return 1 - min; |
| } |
| int pivotIndex(int *nums, int numsSize) { |
| int total = 0; |
| for (int i = 0; i < numsSize; ++i) |
| total += nums[i]; |
| |
| int prefixSum = 0; |
| for (int i = 0; i < numsSize; ++i) { |
| if (prefixSum == total - prefixSum - nums[i]) |
| return i; |
| prefixSum += nums[i]; |
| } |
| return -1; |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/17943057
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步