[متطلبات الأسئلة] تعطيك أرقام N و N. تحتاج الآن إلى العثور على الرقم الذي يحدث أكثر من 50 ٪ من الأوقات في مساحة O (n) داخل O (1).
[ابدأ الهراء] في البداية ، رأيت هذا السؤال أعمى على الفور (TOT)/~~~ (.*). إذا كان هناك متطلبات الوقت فقط لـ O (n) ، فيمكن حلها على الفور باستخدام التجزئة (أي ، مع مساحة للوقت) ، ويبدو أنه من الصعب حل مساحة O (1).
[Thought 1] حلقة مزدوجة ، هذه هي الطريقة الأقل كفاءة لحل هذه المشكلة ، أي حساب عدد المرات التي يظهر فيها لكل رقم ، والتعقيد الزمني O (n^2) قد خرج مباشرة.
[Thought 2] من النوع الأول ، دع الأرقام المماثلة يتم ترتيبها معًا ، ثم اجتياز الرقم الأول. أعط الآن مثالاً ، مثل: 1000012 ، الآن: 0000112 ، ابدأ من 0 ، قم بتعيين عداد T = 0 ، والآن هناك 4 0s ، ثم t = 4 ، ابحث عن أن أكثر من نصفها ، الإخراج 0. هذه الطريقة هي النسخة المحسنة من الطريقة السابقة ، خارج.
[الفكر 3] إنها فكرة تبادل المساحة للوقت والتجزئة لجعل صفيف أحادي البعد لها معنيان. على سبيل المثال ، يمثل A [x] = y أن الرقم x يظهر مرات y. التعقيد الزمني لهذه الطريقة هو o (n) ، لكن المساحة حقًا ... لن أتحدث عنها (*  ̄ ̄)
[الفكر 4] أولاً ، احسب الاحتمال ، وحدد عدد هذه الأرقام التي من المرجح أن تفي بالمتطلبات ، ثم حدد عدد قليل بشكل عشوائي. هذا ... انسى ذلك.
[الفكر 5] موضوع اليوم هو ما يسمى خوارزمية MJRTY ، والمعروفة أيضًا باسم خوارزمية تصويت الأغلبية. الأفكار الرئيسية هي على النحو التالي: (تعقيد وقت الخوارزمية هذه هو o (n)! ليست هناك حاجة لتخزين إضافي في الفضاء ، وبالتالي فإن تعقيد الفضاء هو o (1) !!!)
إذا كان العد == 0 ، فقم بتعيين قيمة التصويت على العنصر الحالي للمصفوفة وتعيين العد إلى 1 ؛
خلاف ذلك ، إذا كان للتصويت وعناصر الصفيف الآن نفس القيمة ، Count ++ ، وإلا عد ؛
كرر خطوتين أعلاه حتى يتم مسح الصفيف.
يتم تعيين العد إلى 0 ، ومسح المصفوفة مرة أخرى من البداية. إذا كانت قيمة عنصر الصفيف هي نفس قيمة التصويت ، فإن Count ++ حتى يتم مسح الصفيف.
إذا كانت قيمة العدد أكبر من أو تساوي N/2 في هذا الوقت ، فسيتم إرجاع قيمة التصويت ، وإلا فإن -1 سيتم إرجاعها ؛
ما يلي هو تنفيذ الكود. نظرًا لأن السؤال يضمن وجود النتيجة ، فقد حذفنا الخطوة الأخيرة من التحقق والتحقق.
رمز المفتاح كما يلي:
#include <IoStream> باستخدام مساحة الاسم std ؛ int len ؛ void find (int* a ، int n) {char complidate ؛ int ntimes ، i ؛ for (i = ntimes = 0 ؛ i <n ؛ i ++) {if (ntimes == 0) complidate = a [i] ، ntimes = 1 ؛ else {if (canneridate == a [i]) } int main () {cin >> len ؛ int a [len] ؛ for (int i = 0 ؛ i <n ؛ i ++) cin >> a [i] ؛ find (a ، len) ؛ما سبق هو عدد أكثر من نصف (50 ٪) من عدد الأحداث التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!