[leetcode] 379. Design Phone Directory 解题报告

来源:互联网 发布:js判断json对象和数组 编辑:程序博客网 时间:2024/05/12 13:44

题目链接: https://leetcode.com/problems/design-phone-directory/

Design a Phone Directory which supports the following operations:

  1. get: Provide a number which is not assigned to anyone.
  2. check: Check if a number is available or not.
  3. release: Recycle or release a number.

Example:

// Init a phone directory containing a total of 3 numbers: 0, 1, and 2.PhoneDirectory directory = new PhoneDirectory(3);// It can return any available phone number. Here we assume it returns 0.directory.get();// Assume it returns 1.directory.get();// The number 2 is available, so return true.directory.check(2);// It returns 2, the only number that is left.directory.get();// The number 2 is no longer available, so return false.directory.check(2);// Release number 2 back to the pool.directory.release(2);// Number 2 is available again, return true.directory.check(2);

思路: 这题的对C++时间卡的太严了, 基本上只要涉及到任何高级数据结构就会超时, 只能利用c风格的代码, 并且所有操作除初始化以外都是O(1)才可以过.

可以利用两个数组和一个当前剩余号码计数, 一个数组前n个保存当前可用的号码, 另一个数组映射每一个号码是否可用, 还有一个计数是当前第一个数组前n个是可用的.

代码如下:

class PhoneDirectory {public:    /** Initialize your data structure here        @param maxNumbers - The maximum numbers that can be stored in the phone directory. */    PhoneDirectory(int maxNumbers){        n = maxNumbers;        available = new int[n];        isAvailable = new int[n];         for(int i = 0; i < n; i++)            available[i] = i, isAvailable[i] = 1;    }        ~PhoneDirectory()    {        delete [] available;        delete [] isAvailable;    }        /** Provide a number which is not assigned to anyone.        @return - Return an available number. Return -1 if none is available. */    int get() {        if(n <= 0) return -1;        int ans = available[--n];        isAvailable[ans] = 0;        return ans;    }        /** Check if a number is available or not. */    bool check(int number) {        return isAvailable[number];    }        /** Recycle or release a number. */    void release(int number) {        if(isAvailable[number]) return;        available[n++] = number;        isAvailable[number] = 1;    }private:    int *available, *isAvailable;    int n;};/** * Your PhoneDirectory object will be instantiated and called as such: * PhoneDirectory obj = new PhoneDirectory(maxNumbers); * int param_1 = obj.get(); * bool param_2 = obj.check(number); * obj.release(number); */

  

0 0