add prob4
This commit is contained in:
75
4-11-container-with-most-water.c
Normal file
75
4-11-container-with-most-water.c
Normal file
@@ -0,0 +1,75 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
struct heightpair {
|
||||
int height;
|
||||
int x;
|
||||
};
|
||||
|
||||
void swap(struct heightpair *a, struct heightpair *b) {
|
||||
struct heightpair tmp = *a;
|
||||
*a = *b;
|
||||
*b = tmp;
|
||||
}
|
||||
|
||||
void quicksort(struct heightpair *a, int le, int ri) {
|
||||
int i = le, j = ri - 1;
|
||||
struct heightpair pivot = a[(rand() %(ri - le)) + le];
|
||||
// printf("le = %d, ri = %d, pivot.height = %d\n", le, ri, pivot.height);
|
||||
// for (int i = le; i < ri; i++) {
|
||||
// printf("%d\n", a[i]);
|
||||
// }
|
||||
while (i <= j) {
|
||||
while (a[i].height > pivot.height) i++;
|
||||
while (a[j].height < pivot.height) j--;
|
||||
// printf("i = %d, j = %d\n", i, j);
|
||||
if (i <= j) swap(&a[i++], &a[j--]);
|
||||
}
|
||||
|
||||
// for (int i = le; i < ri; i++) {
|
||||
// printf("%d\n", a[i]);
|
||||
// }
|
||||
// printf("----\n");
|
||||
|
||||
if (le < j) quicksort(a, le, j + 1);
|
||||
if (i < ri - 1) quicksort(a, i, ri);
|
||||
}
|
||||
|
||||
int maxArea(int *height, int heightSize) {
|
||||
struct heightpair *pairs = (struct heightpair *)malloc(heightSize * sizeof(struct heightpair));
|
||||
for (int i = 0; i < heightSize; i++) {
|
||||
pairs[i].height = height[i];
|
||||
pairs[i].x = i;
|
||||
}
|
||||
quicksort(pairs, 0, heightSize);
|
||||
// for (int i = 0; i < heightSize; i++) {
|
||||
// printf("%d, %d\n", pairs[i].height, pairs[i].x);
|
||||
// }
|
||||
struct heightpair curleft = pairs[0];
|
||||
struct heightpair curright = pairs[0];
|
||||
int curmax = 0;
|
||||
for (int i = 1; i < heightSize; i++) {
|
||||
if (pairs[i].x < curleft.x) {
|
||||
int vol = (curright.x - pairs[i].x) * pairs[i].height;
|
||||
curmax = curmax > vol ? curmax : vol;
|
||||
curleft = pairs[i];
|
||||
}
|
||||
else if (pairs[i].x < curright.x) {
|
||||
int vol1 = (pairs[i].x - curleft.x) * pairs[i].height;
|
||||
int vol2 = (curright.x - pairs[i].x) * pairs[i].height;
|
||||
curmax = curmax > vol1 ? curmax : vol1;
|
||||
curmax = curmax > vol2 ? curmax : vol2;
|
||||
} else {
|
||||
// pairs[i].x > curright.x
|
||||
int vol = (pairs[i].x - curleft.x) * pairs[i].height;
|
||||
curmax = curmax > vol ? curmax : vol;
|
||||
curright = pairs[i];
|
||||
}
|
||||
}
|
||||
return curmax;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int nums[] = {1,8,6,2,5,4,8,3,7};
|
||||
printf("%d\n", maxArea(nums, sizeof(nums) / sizeof(int)));
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user