Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // First missing positive
- class Solution {
- public:
- int firstMissingPositive(vector<int>& nums) {
- if (nums.empty()) {
- return 1;
- }
- int low = 0, high = nums.size() - 1;
- while (low < high) {
- while (low < high && nums[low] > 0) low++;
- while (low < high && nums[high] <= 0) high--;
- if (low < high)
- swap(nums, low, high);
- }
- int endOfPositives = nums[low] > 0 ? low : low - 1;
- int start = 0;
- for (int i = 0; i <= endOfPositives; i++) {
- if (nums[i] > endOfPositives + 1) {
- continue;
- }
- int idxToNegate = nums[i];
- if (idxToNegate < 0) {
- idxToNegate *= -1;
- }
- if (nums[idxToNegate - 1] > 0) {
- nums[idxToNegate - 1] *= -1;
- }
- }
- for (int i = 0; i <= endOfPositives; i++) {
- if (nums[i] > 0) {
- return i + 1;
- }
- }
- return endOfPositives + 2;
- }
- private:
- void swap(vector<int> &nums, int i, int j) {
- int k = nums[i];
- nums[i] = nums[j];
- nums[j] = k;
- }
- };
- // Group anagrams
- class Solution {
- public:
- vector<vector<string>> groupAnagrams(vector<string>& strs) {
- vector<vector<string>> result;
- unordered_map<string, vector<string>> um;
- for (string str: strs) {
- string sortedString = str;
- sort(sortedString.begin(), sortedString.end());
- um[sortedString].push_back(str);
- }
- for (auto e: um) {
- result.push_back(e.second);
- }
- return result;
- }
- };
- // Find duplicate with constant space and time complexity.
- class Solution {
- public:
- // [1, 2, 3, 4, 5, 4]
- int findDuplicate(vector<int>& nums) {
- // Fast and Slow pointers:
- if (nums.empty() || nums.size() == 1) {
- return -1;
- }
- int slowIdx = nums[0], fastIdx = nums[0];
- do {
- slowIdx = nums[slowIdx];
- fastIdx = nums[nums[fastIdx]];
- } while (slowIdx != fastIdx);
- slowIdx = nums[0];
- while (slowIdx != fastIdx) {
- slowIdx = nums[slowIdx];
- fastIdx = nums[fastIdx];
- }
- return slowIdx;
- }
- };
- // Add two numbers
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode() : val(0), next(nullptr) {}
- * ListNode(int x) : val(x), next(nullptr) {}
- * ListNode(int x, ListNode *next) : val(x), next(next) {}
- * };
- */
- class Solution {
- public:
- ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
- ListNode *head = new ListNode(0);
- ListNode *prevNode = nullptr;
- int carry = 0;
- while (l1 != nullptr || l2 != nullptr || carry != 0) {
- int sum = carry;
- if (l1 != nullptr) {
- sum += l1->val;
- l1 = l1->next;
- }
- if (l2 != nullptr) {
- sum += l2->val;
- l2 = l2->next;
- }
- if (prevNode == nullptr) {
- head->val = sum % 10;
- prevNode = head;
- } else {
- prevNode->next = new ListNode(sum % 10);
- prevNode = prevNode->next;
- }
- carry = sum / 10;
- }
- return head;
- }
- };
- // Merge intervals - sort by startTime
- class Solution {
- public:
- vector<vector<int>> merge(vector<vector<int>>& intervals) {
- vector<vector<int>> result;
- sort(intervals.begin( ), intervals.end( ), []( const auto& lhs, const auto& rhs)
- {
- return lhs[0] < rhs[0];
- });
- vector<int> curInterval = intervals[0];
- for (int i = 1; i < intervals.size(); i++) {
- if (curInterval[1] >= intervals[i][0]) {
- curInterval[1] = max(curInterval[1], intervals[i][1]);
- curInterval[0] = min(curInterval[0], intervals[i][0]);
- } else {
- result.push_back(curInterval);
- curInterval = intervals[i];
- }
- }
- result.push_back(curInterval);
- return result;
- }
- };
- // Max sub array
- class Solution {
- public:
- int maxSubArray(vector<int>& nums) {
- if (nums.empty()) {
- return 0;
- }
- int sum = 0, maxSum = numeric_limits<int>::min();
- for (int i = 0; i < nums.size(); i++) {
- sum += nums[i];
- if (sum > maxSum) {
- maxSum = sum;
- }
- if (sum < 0) {
- sum = 0;
- }
- }
- return maxSum;
- }
- };
- // Insert Delete GetRandom in O(1) time
- class RandomizedSet {
- public:
- RandomizedSet() {
- }
- bool insert(int val) {
- if (m.find(val) != m.end()) return false;
- nums.emplace_back(val);
- m[val] = nums.size() - 1;
- return true;
- }
- bool remove(int val) {
- if (m.find(val) == m.end()) return false;
- int last = nums.back();
- m[last] = m[val];
- nums[m[val]] = last;
- nums.pop_back();
- m.erase(val);
- return true;
- }
- int getRandom() {
- return nums[rand() % nums.size()];
- }
- private:
- vector<int> nums;
- unordered_map<int, int> m;
- };
Advertisement
Add Comment
Please, Sign In to add comment