-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathproblem40.c
More file actions
89 lines (73 loc) · 1.68 KB
/
problem40.c
File metadata and controls
89 lines (73 loc) · 1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <stdlib.h>
int *takeInput(int *n){
printf("Enter the number of elements in the array: ");
scanf("%d", n);
if(*n <= 0){
printf("!! Invalid Input !!\n");
exit(1);
}
int *arr = (int *)malloc((*n) * sizeof(int));
if(!arr){
printf("Memory Allocation Failed\n");
exit(1);
}
printf("Enter %d integers: ", *n);
for(int i = 0; i < *n; i++){
scanf("%d", &arr[i]);
}
return arr;
}
void findNextGreater(int *arr, int *nextGreater, int n){
int *stack = (int *)malloc(n * sizeof(int));
int top = -1;
for(int i = n - 1; i >= 0; i--){
while(top >= 0 && arr[stack[top]] <= arr[i])
top--;
nextGreater[i] = (top == -1) ? -1 : stack[top];
stack[++top] = i;
}
free(stack);
}
void solveMysticalArray(int *arr, int *nextGreater, int *result, int n){
for(int i = 0; i < n; i++){
int ng = nextGreater[i];
if(ng == -1){
result[i] = -1;
continue;
}
int found = 0;
for(int j = ng + 1; j < n; j++){
if(arr[j] < arr[ng]){
result[i] = arr[j];
found = 1;
break;
}
}
if(!found) result[i] = -1;
}
}
void displayResult(int *result, int n){
printf("Output: ");
for(int i = 0; i < n; i++){
printf("%d", result[i]);
}
}
int main(){
int n;
int *arr = takeInput(&n);
int *nextGreater = (int*)malloc(n * sizeof(int));
int *result = (int*)malloc(n * sizeof(int));
if(!nextGreater || !result){
printf("Memory Allocation Failed\n");
free(arr);
exit(1);
}
findNextGreater(arr, nextGreater, n);
solveMysticalArray(arr, nextGreater, result, n);
displayResult(result, n);
free(arr);
free(nextGreater);
free(result);
return 0;
}