子数组最大累加和
| int max(int a, int b, int c) { |
| int d = a > b ? a : b; |
| return d > c ? d : c; |
| } |
| |
| |
| int maxCrossingSum(int *nums, int left, int mid, int right) { |
| int leftMax = nums[mid]; |
| int rightMax = nums[mid + 1]; |
| |
| int index = mid; |
| int tempMax = 0; |
| |
| while (index >= left) { |
| tempMax += nums[index]; |
| if (tempMax > leftMax) leftMax = tempMax; |
| index--; |
| } |
| |
| index = mid + 1; |
| tempMax = 0; |
| |
| while (index <= right) { |
| tempMax += nums[index]; |
| if (tempMax > rightMax) rightMax = tempMax; |
| index++; |
| } |
| |
| return leftMax + rightMax; |
| } |
| |
| |
| int maxSubArraySum(int *nums, int left, int right) { |
| if (left == right) return nums[left]; |
| |
| int mid = left + ((right - left) >> 1); |
| |
| |
| |
| |
| |
| return max(maxSubArraySum(nums, left, mid), |
| maxSubArraySum(nums, mid + 1, right), |
| maxCrossingSum(nums, left, mid, right)); |
| } |
| |
| |
| int maxSubArray(int *nums, int numsSize) { |
| if (numsSize == 0) return 0; |
| return maxSubArraySum(nums, 0, numsSize - 1); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int maxSubArray(int *nums, int numsSize) { |
| |
| int dp[numsSize]; |
| dp[0] = nums[0]; |
| for (int i = 1; i < numsSize; ++i) |
| dp[i] = max(nums[i], dp[i - 1] + nums[i]); |
| int res = 0x80000000; |
| for (int i = 0; i < numsSize; ++i) |
| if (res < dp[i]) res = dp[i]; |
| return res; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int maxSubArray(int *nums, int numsSize) { |
| int pre, cur; |
| int res = nums[0]; |
| pre = nums[0]; |
| for (int i = 1; i < numsSize; ++i) { |
| cur = max(nums[i], pre + nums[i]); |
| if (res < cur) res = cur; |
| pre = cur; |
| } |
| return res; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int maxSubArray(int *nums, int numsSize) { |
| int pre = 0x80000000, cur; |
| |
| int left, right; |
| int res = nums[0]; |
| for (right = 0; right < numsSize; ++right) { |
| if (pre >= 0) { |
| cur = pre + nums[right]; |
| } else { |
| cur = nums[right]; |
| left = right; |
| } |
| res = max(cur, res); |
| pre = cur; |
| } |
| printf("left=%d right=%d\n", left, right); |
| return res; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int rob(int *nums, int numsSize) { |
| if (numsSize == 1) return nums[0]; |
| |
| int dp[numsSize]; |
| dp[0] = nums[0]; |
| dp[1] = max(nums[0], nums[1]); |
| |
| for (int i = 2; i < numsSize; ++i) { |
| |
| |
| dp[i] = max(dp[i-1], dp[i-2] + nums[i]); |
| } |
| |
| return dp[numsSize - 1]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int rob(int *nums, int numsSize) { |
| int left = 0; |
| int mid = 0; |
| int right = 0; |
| |
| for (int i = 0; i < numsSize; ++i) { |
| right = max(mid, left + nums[i]); |
| left = mid; |
| mid = right; |
| } |
| |
| return right; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int rob(int *nums, int numsSize) { |
| if (numsSize == 1)return nums[0]; |
| if (numsSize == 2)return max(nums[0], nums[1]); |
| |
| int dp[numsSize]; |
| dp[0] = nums[0]; |
| dp[1] = max(nums[0], nums[1]); |
| |
| |
| |
| |
| |
| for (int i = 2; i < numsSize; ++i) |
| dp[i] = max(dp[i - 1], max(nums[i], dp[i - 2] + nums[i])); |
| return dp[numsSize-1]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int rob(int *nums, int numsSize) { |
| if (numsSize == 1)return nums[0]; |
| if (numsSize == 2)return max(nums[0], nums[1]); |
| int left, mid, right; |
| left = nums[0]; |
| mid = max(nums[0], nums[1]); |
| for (int i = 2; i < numsSize; ++i) { |
| right = max(mid, max(nums[i], left + nums[i])); |
| left = mid; |
| mid = right; |
| } |
| |
| return right; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| int maxSubarraySumCircular(int *nums, int numsSize) { |
| |
| int maxSum = nums[0]; |
| |
| int minSum = nums[0]; |
| |
| int sum = nums[0]; |
| int maxPre = nums[0], minPre = nums[0]; |
| |
| |
| |
| for (int i = 1; i < numsSize; ++i) { |
| sum += nums[i]; |
| |
| maxPre = max(nums[i], nums[i] + maxPre); |
| maxSum = max(maxSum, maxPre); |
| |
| minPre = min(nums[i], nums[i] + minPre); |
| minSum = min(minSum, minPre); |
| } |
| |
| |
| return sum == minSum ? maxSum : max(maxSum, sum - minSum); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int best(int *nums, int start, int end) { |
| if (start > end) return 0; |
| if (start == end) return nums[start]; |
| if (start + 1 == end) return max(nums[start], nums[end]); |
| |
| int left = nums[start]; |
| |
| int mid = max(nums[start], nums[start + 1]); |
| |
| int right; |
| |
| |
| for (int i = start + 2; i <= end; ++i) { |
| right = max(mid, max(nums[i], nums[i] + left)); |
| left = mid; |
| mid = right; |
| } |
| return right; |
| } |
| |
| int rob(int *nums, int numsSize) { |
| if (numsSize == 1) return nums[0]; |
| |
| return max(nums[0] + best(nums, 2, numsSize - 2), best(nums, 1, numsSize - 1)); |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| |
| int mostRob(int *nums, int numsSize, int ability) { |
| if (numsSize == 1) return nums[0] <= ability ? 1 : 0; |
| if (numsSize == 2) return (nums[0] <= ability || nums[1] <= ability) ? 1 : 0; |
| int dp[numsSize]; |
| dp[0] = nums[0] <= ability ? 1 : 0; |
| dp[1] = (nums[0] <= ability || nums[1] <= ability) ? 1 : 0; |
| |
| for (int i = 2; i < numsSize; ++i) |
| dp[i] = max(dp[i - 1], (nums[i] <= ability ? 1 : 0) + dp[i - 2]); |
| return dp[numsSize - 1]; |
| } |
| |
| int minCapability(int *nums, int numsSize, int k) { |
| |
| int left = nums[0]; |
| int right = nums[0]; |
| for (int i = 0; i < numsSize; ++i) { |
| if (nums[i] < left) left = nums[i]; |
| if (nums[i] > right) right = nums[i]; |
| } |
| |
| int mid; |
| |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| int temp = mostRob(nums, numsSize, mid); |
| if (temp >= k) |
| right = mid - 1; |
| else |
| left = mid + 1; |
| } |
| return left; |
| } |
| |
| |
| int mostRob(int *nums, int numsSize, int ability) { |
| if (numsSize == 1) return nums[0] <= ability ? 1 : 0; |
| if (numsSize == 2) return (nums[0] <= ability || nums[1] <= ability) ? 1 : 0; |
| int left = nums[0] <= ability ? 1 : 0; |
| int mid = (nums[0] <= ability || nums[1] <= ability) ? 1 : 0; |
| int right; |
| |
| for (int i = 2; i < numsSize; ++i) { |
| right = max(mid, (nums[i] <= ability ? 1 : 0) + left); |
| left = mid; |
| mid = right; |
| } |
| return right; |
| } |
| |
| int mostRob(int *nums, int numsSize, int ability) { |
| int res = 0; |
| int i = 0; |
| while (i < numsSize) { |
| |
| if (nums[i] <= ability) { |
| res++; |
| |
| i += 2; |
| } else { |
| i++; |
| } |
| } |
| return res; |
| } |
| int *getMaxMatrix(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) { |
| int rowSize = matrixSize; |
| int columnSize = *matrixColSize; |
| int *res = (int *) calloc(4, sizeof(int)); |
| *returnSize = 4; |
| int maxSum = 0x80000000; |
| |
| int arr[columnSize]; |
| |
| for (int up = 0; up < rowSize; ++up) { |
| |
| memset(arr, 0, sizeof(int) * columnSize); |
| for (int down = up; down < rowSize; ++down) { |
| |
| int tempSum = 0x80000000; |
| int left = 0; |
| |
| for (int right = 0; right < columnSize; ++right) { |
| |
| arr[right] += matrix[down][right]; |
| if (tempSum >= 0) { |
| |
| tempSum += arr[right]; |
| } else { |
| |
| tempSum = arr[right]; |
| |
| left = right; |
| } |
| if (tempSum > maxSum) { |
| maxSum = tempSum; |
| res[0] = up; |
| res[1] = left; |
| res[2] = down; |
| res[3] = right; |
| } |
| } |
| } |
| } |
| |
| return res; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步