Showing posts with label Set. Show all posts
Showing posts with label Set. Show all posts

Tuesday, September 19, 2017

414. Third Maximum Number

https://leetcode.com/problems/third-maximum-number/description/
Solution 1. Use a set
    int thirdMax(vector<int>& nums) {
        set<int> top3;
        for(int n:nums){
            if(top3.size()<3 || n> *top3.begin())
                top3.insert(n);
            if(top3.size()>3) top3.erase(top3.begin());
        }
        return (top3.size() == 3) ? *top3.begin() : *top3.rbegin();
    }
Solution 2. Use pointers
    int thirdMax(vector<int>& nums) {
        int *p1 = &nums[0], *p2 = nullptr, *p3 = nullptr;
        for(int i=0; i<nums.size(); i++) {
            if(nums[i] > *p1) {
                p3 = p2;
                p2 = p1;
                p1 = &nums[i];
            }
            else if(nums[i] == *p1) continue;
            else if(!p2) p2 = &nums[i];
            else if(nums[i] < *p1 && nums[i] > *p2) {
                p3 = p2;
                p2 = &nums[i];
            }
            else if(nums[i] == *p2) continue;
            else if(!p3) p3 = &nums[i];
            else if(nums[i] < *p2 && nums[i] > *p3 ) {
                p3 = &nums[i];
            }
        }
        if(p3) return *p3;
        else return *p1;
    }
Solution 3
    int thirdMax(vector<int>& nums) {
        int m1 = INT_MIN, m2 = INT_MIN, m3 = INT_MIN, i = 0;
        for(int n : nums) {
            if(n > m1) {
                m3 = m2;
                m2 = m1;
                m1 = n;
                i++;
            }
            else if(n < m1 && n > m2) {
                m3 = m2;
                m2 = n;
                i++;
            }
            else if(n < m2 && n > m3 ) {
                m3 = n;
                i++;
            }
            else if(n == INT_MIN) i++;
        }
        if(m1>m2 && m2>m3 && i>=3) return m3;
        else return m1;
    }

Wednesday, September 13, 2017

219. Contains Duplicate II

https://leetcode.com/problems/contains-duplicate-ii/description/
Solution 1. Use map to store the index for each distinct number.
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        if(nums.size()<2) return false;
        unordered_map<int, int> mp;
        for(int i=0; i<nums.size(); i++) {
            if(mp.count(nums[i]))
                if(i - mp[nums[i]]<=k) return true;
            mp[nums[i]] = i;
        }
        return false;
    }
Solution 2. Use unordered_set to maintain a set containing nums[i-k,...,i-1].
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        if(nums.size()<2 || k<=0) return false;
        unordered_set<int> st;
        for(int i=0; i<nums.size(); i++) {
            if(st.count(nums[i]))
                return true;
            else {
                if(i-k>=0) st.erase(nums[i-k]);
                st.insert(nums[i]);
            }
        }
        return false;
    }