亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

刪除到目前為止的重復數字刪除下一個數字 Big O(n)

刪除到目前為止的重復數字刪除下一個數字 Big O(n)

動漫人物 2023-07-28 10:22:21
問題說要刪除重復的數字。然后,將數字保留在一個數組中,不要重復其他數字。例如, [0, 0, 1, 1, 2, 2, 1, 1 , 2, 2] 將是 [0, 1, 2 ] 這些數字應為時間復雜度 Big O(n) 和空間復雜度 O (1).到目前為止,我所擁有的是下一個數字,檢查下一個數字。它沒有得到比它更遠的數字。例如: [ 0, 1, 2 ,3 , 4, 5, 6, 2, 8, 9 ] 2 距離較遠,但下面的代碼不會檢查。D[i+1]我無法使用哈希圖或哈希集。    while (i < A.length) {        i++;        D = A;        if (i < A.length - 1) {            if (A[i] == D[i+1]){                B[i] = D[i + 1];            } else                A[i] = A[i];        }    }
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

如果輸入數組未排序(并且根據您的說法 - 未排序),您將無法在O(n)時間和空間上完成任務。O(1)

這是不可能的,因為為了刪除元素,您必須檢查數組中之前或之后的任何位置是否有重復項。

要檢查重復項,您必須:

  • 掃描輸入數組(這將導致O(n^2)整個算法的時間)

  • 使用額外的空間,例如使用Set(這將導致O(n)時間和O(n)空間)。

所以基本上你必須權衡時間和空間,反之亦然。


查看完整回答
反對 回復 2023-07-28
?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

這可能是不可能的,除非數組使用鏈表進行排序或將元素標記為 Integer.MIN_VALUE,應用此原則的“空間和時間權衡”如果我們需要更快的時間,那么我們需要權衡空間,反之亦然。

  • 如果使用數組,那么您可以將重復元素標記為 Integer.MIN_VALUE(在 java 中或在 c/c++ 中 -2^16),并且可以忽略該值。

  • 如果使用鏈表并且數組已排序,則只需檢查下一個節點與前一個節點并刪除下一個重復節點。


查看完整回答
反對 回復 2023-07-28
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

您必須“檢查所有前面的內容”,而不是“檢查下一個”。

那么問題就變成了,“如何檢查一個數字在恒定時間內是否存在于任意數量的其他元素中”?

使用一個HashSet. 基于哈希的結構的所有操作都是 O(1)。

add()考慮使用和contains()的兩種方法HashSet。

我把寫的代碼留給你......


查看完整回答
反對 回復 2023-07-28
  • 3 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號