@@ -0,0 +1,58 @@ | |||
class MinStack: | |||
def __init__(self): | |||
self.stack = [] | |||
self.minEl = None | |||
def push(self, x: int) -> None: | |||
node = Node(x) | |||
if self.minEl is None or node.value <= self.minEl.value: | |||
node.lastMin = self.minEl | |||
self.minEl = node | |||
self.stack.append(node) | |||
def pop(self) -> None: | |||
if len(self.stack) > 0: | |||
ret = self.stack[len(self.stack) - 1] | |||
if ret.value == self.minEl.value: | |||
self.minEl = self.minEl.lastMin | |||
self.stack = self.stack[0:len(self.stack) - 1] | |||
return ret.value | |||
return None | |||
def top(self) -> int: | |||
if len(self.stack) > 0: | |||
return self.stack[len(self.stack) - 1].value | |||
return None | |||
def getMin(self) -> int: | |||
return self.minEl.value | |||
def __str__(self): | |||
str_result = "" | |||
for x in self.stack: | |||
str_result += "\n" | |||
str_result += str(x) | |||
return str_result | |||
class Node: | |||
def __init__(self, x, lastMin = None): | |||
self.value = x | |||
self.lastMin = lastMin | |||
def __str__(self): | |||
return f"Value: {str(self.value)} Last Min: {str(self.lastMin)}" | |||
# Your MinStack object will be instantiated and called as such: | |||
values = [] | |||
obj = MinStack() | |||
obj.push(-2) | |||
obj.push(0) | |||
obj.push(-3) | |||
values.append(obj.getMin()) | |||
values.append(obj.pop()) | |||
values.append(obj.top()) | |||
values.append(obj.getMin()) | |||
print("Expected: [-3, -3, 0, -2]") | |||
print("Got:", values) |
@@ -0,0 +1,20 @@ | |||
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. | |||
push(x) -- Push element x onto stack. | |||
pop() -- Removes the element on top of the stack. | |||
top() -- Get the top element. | |||
getMin() -- Retrieve the minimum element in the stack. | |||
Example: | |||
MinStack minStack = new MinStack(); | |||
minStack.push(-2); | |||
minStack.push(0); | |||
minStack.push(-3); | |||
minStack.getMin(); --> Returns -3. | |||
minStack.pop(); | |||
minStack.top(); --> Returns 0. | |||
minStack.getMin(); --> Returns -2. | |||
@@ -0,0 +1,3 @@ | |||
#!/bin/bash | |||
python3 main.py |
@@ -0,0 +1,31 @@ | |||
#include <stdio.h> | |||
int removeDuplicates(int*, int); | |||
int removeDuplicates(int* nums, int numsSize) { | |||
if (numsSize == 0) { | |||
return 0; | |||
} | |||
int shift = 0; | |||
int last = nums[0] + 1; // This way the first item will never be a duplicate | |||
for (int i = 0; i < numsSize; i++) { | |||
int value = nums[i]; | |||
nums[i - shift] = value; | |||
if (value == last) { | |||
shift++; | |||
} | |||
last = value; | |||
} | |||
return numsSize - shift; | |||
} | |||
int main() { | |||
printf("Expetected: Length 5, [0, 1, 2, 3, 4]\n"); | |||
int arr[10] = {0,0,1,1,1,2,2,3,3,4}; | |||
int newLength = removeDuplicates(&arr[0], 10); // &arr[0] is a hack to stop warning about static sized pointer being passed | |||
printf("Got: Length: %d,", newLength); | |||
for (int i = 0; i < newLength; i++) { | |||
printf(" %d ", arr[i]); | |||
} | |||
printf("\n"); | |||
return 0; | |||
} |
@@ -0,0 +1,36 @@ | |||
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length. | |||
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory. | |||
Example 1: | |||
Given nums = [1,1,2], | |||
Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. | |||
It doesn't matter what you leave beyond the returned length. | |||
Example 2: | |||
Given nums = [0,0,1,1,1,2,2,3,3,4], | |||
Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. | |||
It doesn't matter what values are set beyond the returned length. | |||
Clarification: | |||
Confused why the returned value is an integer but your answer is an array? | |||
Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well. | |||
Internally you can think of this: | |||
// nums is passed in by reference. (i.e., without making a copy) | |||
int len = removeDuplicates(nums); | |||
// any modification to nums in your function would be known by the caller. | |||
// using the length returned by your function, it prints the first len elements. | |||
for (int i = 0; i < len; i++) { | |||
print(nums[i]); | |||
} |
@@ -0,0 +1,5 @@ | |||
#!/bin/bash | |||
gcc -o main main.c | |||
./main | |||
rm main |