| @@ -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 | |||