Find All Numbers Disappeared in an Array

Description:
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements of [1, n] inclusive that do not appear in this array.
Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

My answer:

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
       int len=nums.size();
        if(len==0||len==1)
            return nums;
        else
        {
            set<int> arr(nums.begin(),nums.end());
            nums.assign(arr.begin(),arr.end());
            int chang=nums.size();
            int k=1;
            nums.clear();
            set<int>::iterator it;
            for(it=arr.begin();it!=arr.end();)
            {
                if(*it!=k)
                {
                    nums.push_back(k++);
                }            
                else
                {
                   it++;
                   k++;
                }                
            }     
            while(k<=len)
                nums.push_back(k++);
            return nums;
        }
    }
};

best answer:

int static fast = [](){
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0); return 0;
}();

class Solution {
  public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
      vector<int> result;
      int size = nums.size();
      for(int i=0; i < size; ++i) {
        int index = abs(nums[i])-1;
        if(nums[index] > 0) {
          nums[index] = -nums[index];
        }
      }
      for(int i=0; i < size; ++i) {
        if(nums[i] > 0) {
          result.push_back(i+1);
        }
        else {
          nums[i] = -nums[i];
        }
      }
      return result;
    }
};

int static fast = {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0); return 0;
}();
這段代碼是我不太懂的點。emmm,不知道誰能發現這個寶藏fast。
首先這段代碼是爲了加速讀入和寫出的。
經常會有建議說用scanf/printf來代替cin/cout,可以縮短時間,但是習慣C++的同志們如果想用cin/cout,並且不會在輸入輸出上花費大量時間的話就可以加上這段代碼。
ios::sync_with_stdio(false);
如果在程序執行其第一個輸入或輸出操作之前調用了所有c++標準流,則它將同步開啓或關閉與其對應的標準C流的所有c++標準流。添加ios_base:sync_with_stdio(false);(默認情況下是正確的),可以在任何I/O操作之前避免此同步。它是std::ios_base函數的一個靜態成員。
簡單來講就是,不會再I/O操作前同時開啓所有標準流。
cin.tie(0);
tie()簡單的保證std::cout在std::cin接受輸入之前刷新的方法。這對於交互控制檯程序非常有用,這些程序需要不斷更新控制檯,但對於大型I/O,會減慢程序的速度。NULL部分只返回一個空指針。
cout.tie(0); 同理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章