原始問題
一種較好的思路:
如果每次刪除兩個不同的id(不管是否包含「水王」的id),那麼,在剩下的id列表中,「水王」id出現的次數仍然超過總數的一半。看到這一點之後,就可以通過不斷重複這個過程,把id列表中的id總數降低**化為更小的問題),從而得到問題的答案,總的時間複雜度只有o(n),且只需要常數的額外記憶體。偽**如下:
type find(type * id, int n)
else
}return candidate;
}
擴充套件問題:
隨著tango的發展,管理員發現,「超級水王」沒有了。統計結果表明,有3個發帖很多的id,他們的發帖數目都超過了帖子總數目n的1/4。你能從發帖id列表中快速找出他們的id嗎?
思路:先從2個人,每個人發貼數目都超過總數目的1/3開始考慮,思路和上面的思路是一樣的,每次刪除三個不一樣的便可。只需增加乙個ntimes2和乙個candidate2便可,偽**如下:
void find(type * id, int n)
} else if (ntimes2 == 0)
}else
}printf("兩個水王id分別是:%d,%d\n", candidate1, candidate2);//假設id型別為int
}
當「水王」數增加到3個時,思路還是一樣,由上面程式再直接增加乙個ntimes3和candidate3便可,偽**如下:
void find(type * id, int n)
} else if (ntimes2 == 0)
}else if (ntimes3 == 0)
}else
}printf("三個水王id分別是:%d,%d,%d\n", candidate1, candidate2, candidate3);
}
程式設計之美 尋找發帖「水王」
描述 直接拍照,懶得打字 此題很容易轉換為,在乙個陣列中,有乙個數出現的次數超過了陣列元素個數的一半,請找出這個元素。方法一 對陣列排序進行排序,利用通常的排序方法,複雜度o nlgn 再遍歷一遍陣列,找出那個元素,複雜度為o n 空間複雜度o 1 方法二 空間換時間吧,在開闢乙個陣列,hash對映...
程式設計之美 尋找發帖「水王」
基礎問題 找出發帖數超過帖子總數一半的id.拓展問題 有三人發帖數都超過了帖子總數目n 的1 4 找出他們的 id.我們可以先排序然後找出中間的那個id 但可以考慮避免排序來改進時間複雜度。每次從列表刪除兩個不相同的id 剩餘的相同 id就是找到的 水王 type find type id,int ...
程式設計之美 尋找發帖水王
程式設計之美 尋找發帖水王.cpp 定義控制台應用程式的入口點。有乙個水王發帖超過一半 給你發帖所有的id 找到他 統計每個id出現次數 找到最大的 超過一半 include stdafx.h include include include using namespace std class id ...