開門見山 : 讀取時記下上一個和現在的輸入值,計算"差"之後再放入陣列(動態or靜態)裡面,將陣列排列後寫一個for loop逐一核對有無滿足序列 1,2,3,4,...,n-1。
1.
這題使用set標頭檔的話,可以用for迴圈將前後項的差值一個一個insert進去。
因為C++的set裡面是由紅黑樹實作的,這個過程需要O(log n)時間複雜度,
但插入之後會自動幫你由小排到大,不需要額外呼叫sort的函式庫。
2.
使用靜態陣列的話要注意記憶體管理的問題(該new就new,該delete就delete),當n很大時容易 RE 。
3.
跟2.的情形有一點類似。使用vector標頭檔的話,依我嘗試後的心得,不建議先初始化為vector<int>v(n,0),此舉會占用記憶體空間。
可以在讀取數字進來的時候,計算前後項差值,再用push_back推進去v裡面,時間複雜度O(1)。
讀取完之後,再用sort將數列由小排到大即可,平均而言時間複雜度O(n log n)。
時間複雜度方面set和vector都是O(n log n),整體而言我個人覺得set最方便debug,有什麼更好的寫法也歡迎討論。