最?可?ID

現代社會中,有很多服務依賴?種被稱為ID的概念。例如?份證就是?種ID,銀?賬戶也是?種ID,電話號碼本質上也是?種ID。假設我們使??負整數作為某個系統(tǒng)的的ID,所有?戶都由?個ID唯?確定。任何時間,這個系統(tǒng)中有些ID處在使?中的狀態(tài),有些ID則可以?于分配給新?戶?,F在的問題是,怎樣才能找到最?的可分配ID呢?例如下?的列表記錄了當前正在被使?的ID:

[18, 4, 8, 9, 16, 1, 14, 7, 19, 3, 0, 5, 2, 11, 6]

最?可分配的ID,也就是不在這個列表中的最?整數是10

解法一:

思路

因為是求最小可用ID,可遞歸枚舉ID,這個過程是O(n),枚舉的ID,若該ID?列表,則該ID為最小可分配的ID,判斷一個元素屬不屬于一個列表,這一過程是O(n)。綜上,算法時間復雜度為O(n2)

代碼

<pre><code>
def Min_Free(lst):

n = len(lst)
for i in xrange(0,n):
    if i not in lst:
        return i

</code>
</pre>

解法二:

思路

算法二思路

開辟一個標記數組,標記列表元素對應的位置為TRUE,這一個過程時間為O(n),再循環(huán)遍歷標記數組,輸出第一個FALSE對應的索引,即為最小可分配ID,這一過程時間為O(n)。綜上,該算法時間復雜度為O(n)

代碼

<pre><code>
def Min_Free2(lst):

  n = len(lst)
  marked = [False]*(n+1)
  for elem in lst:
      if elem<n:
          marked[elem] = True
  for i in xrange(0,n):
      if marked[i] ==False:
          return i

</code></pre>
<p>上述代碼只是為了分析時間復雜度更清晰,為了代碼的簡潔,作如下修改</p>
<pre><code>
def Min_Free2_1(lst):

  n = len(lst)
  marked = [False]*(n+1)
  for elem in lst:
      if elem<n:
          marked[elem] = True
  return marked.index(False)

</code></pre>

解法三

思路

借助快排,時間復雜度為O(nlgn),排序后,在看元素的值和索引是否相同,若不同則返回該元素的索引。

代碼

<pre><code>
def Min_Free3(lst):

  lst = sorted(lst)
  n = len(lst)
  for i in range(0,n):
      if lst[i]!=i:
          return i

</code></pre>

解法四

思路

解法四思路
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評論 18 399
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,760評論 11 349
  • 雨后大陸漲江潮, 眼前長空橫彩橋。 蛩哀云淡暗夕暉, 鵲喜風和月明照。 鳥筑玉宇臥幼子, 仙造金殿安阿嬌。 但使神...
    果州聞郡閱讀 270評論 0 0
  • 穿越時空的少女時代, 我在原地守候你回來。 沒有無緣無故的差錯, 我卻愿意等待著奇跡。 一步一步的走下去, 我是不...
    阿俊xi閱讀 328評論 0 0
  • 生活在這個世界上,每個人都要學會獨立,學會面對寂寞。 生命旅程中,任何生命個體都不可能擺脫寂寞。寂寞使空虛的人孤苦...
    曉雪Eileen閱讀 187評論 0 0

友情鏈接更多精彩內容