Bird
Raised Fist0
DSA Pythonprogramming

Majority Element Moore's Voting Algorithm in DSA Python

Choose your learning style10 modes available
Mental Model
Find the element that appears more than half the time by canceling out different elements.
Analogy: Imagine a room where people vote for their favorite color. Every time two people with different colors meet, they leave together. The color left at the end is the majority color.
Array: [2, 2, 1, 1, 1, 2, 2]
Index:  0  1  2  3  4  5  6
Candidate: ↑
Count: 1
Dry Run Walkthrough
Input: list: [2, 2, 1, 1, 1, 2, 2]
Goal: Find the majority element that appears more than half the time in the list.
Step 1: Start with first element as candidate=2, count=1
Candidate=2, Count=1, Array=[2, 2, 1, 1, 1, 2, 2]
Why: We need a starting point to compare others.
Step 2: Next element is 2, same as candidate, increment count to 2
Candidate=2, Count=2, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Same element increases confidence in candidate.
Step 3: Next element is 1, different from candidate, decrement count to 1
Candidate=2, Count=1, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Different element cancels out one occurrence.
Step 4: Next element is 1, different from candidate, decrement count to 0
Candidate=2, Count=0, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Count zero means candidate lost majority so far.
Step 5: Count is zero, pick new candidate=1, count=1
Candidate=1, Count=1, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Reset candidate to current element.
Step 6: Next element is 1, same as candidate, increment count to 2
Candidate=1, Count=2, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Same element increases count.
Step 7: Next element is 2, different from candidate, decrement count to 1
Candidate=1, Count=1, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Different element cancels out one occurrence.
Step 8: Next element is 2, different from candidate, decrement count to 0
Candidate=1, Count=0, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Count zero means candidate lost majority so far.
Step 9: Count is zero, pick new candidate=2, count=1
Candidate=2, Count=1, Array=[2, 2, 1, 1, 1, 2, 2]
Why: Reset candidate to current element.
Result:
Candidate=2 with final count=1
Majority element is 2
Annotated Code
DSA Python
class Solution:
    def majorityElement(self, nums: list[int]) -> int:
        candidate = None
        count = 0
        for num in nums:
            if count == 0:
                candidate = num  # reset candidate when count is zero
                count = 1
            elif num == candidate:
                count += 1  # same element increases count
            else:
                count -= 1  # different element decreases count
        return candidate

# Driver code
nums = [2, 2, 1, 1, 1, 2, 2]
sol = Solution()
print(sol.majorityElement(nums))
if count == 0: candidate = num # reset candidate when count is zero count = 1
Reset candidate to current element when count drops to zero
elif num == candidate: count += 1 # same element increases count
Increase count if current element matches candidate
else: count -= 1 # different element decreases count
Decrease count if current element differs from candidate
OutputSuccess
2
Complexity Analysis
Time: O(n) because we scan the list once to find the candidate
Space: O(1) because we use only two variables regardless of input size
vs Alternative: Naive approach counts each element frequency using extra space O(n), Moore's algorithm uses constant space and linear time
Edge Cases
Empty list
Returns None or no candidate since no elements exist
DSA Python
candidate = None
count = 0
for num in nums:
List with one element
Returns that single element as majority
DSA Python
if count == 0:
    candidate = num
    count = 1
No majority element (less than half)
Algorithm returns a candidate but it may not be majority; verification needed if strict majority required
DSA Python
return candidate
When to Use This Pattern
When you need to find an element that appears more than half the time without extra space, use Moore's Voting Algorithm because it efficiently cancels out minority elements.
Common Mistakes
Mistake: Not resetting count to 1 when picking a new candidate
Fix: Set count = 1 immediately after assigning a new candidate
Mistake: Assuming the candidate is always majority without verification
Fix: Verify candidate frequency if problem requires strict majority confirmation
Summary
Finds the element that appears more than half the time by canceling out different elements.
Use when you want to find the majority element in linear time and constant space.
The key insight is that pairs of different elements cancel each other, leaving the majority element at the end.

Practice

(1/5)
1. What is the main purpose of Moore's Voting Algorithm in an array of numbers?
easy
A. To find the element that appears more than half the time
B. To sort the array in ascending order
C. To find the smallest element in the array
D. To count the total number of unique elements

Solution

  1. Step 1: Understand the problem Moore's Voting Algorithm solves

    The algorithm is designed to find the majority element, which is the element that appears more than half the time in the array.
  2. Step 2: Compare with other options

    Sorting, finding smallest element, or counting unique elements are not the goals of this algorithm.
  3. Final Answer:

    To find the element that appears more than half the time -> Option A
  4. Quick Check:

    Majority element = element with >50% frequency [OK]
Hint: Majority element appears more than half times [OK]
Common Mistakes:
  • Confusing majority element with most frequent element
  • Thinking it sorts the array
  • Assuming it counts unique elements
2. Which of the following is the correct initialization step in Moore's Voting Algorithm in Python?
easy
A. count = 0; candidate = 0
B. count = 1; candidate = 0
C. count = None; candidate = 0
D. count = 0; candidate = None

Solution

  1. Step 1: Recall initialization in Moore's Voting Algorithm

    We start with count = 0 and candidate = None to indicate no candidate chosen yet.
  2. Step 2: Check other options for correctness

    Starting count at 1 or candidate at 0 without context is incorrect; None is used to indicate no candidate.
  3. Final Answer:

    count = 0; candidate = None -> Option D
  4. Quick Check:

    Initialize count=0 and candidate=None [OK]
Hint: Start count at 0 and candidate as None [OK]
Common Mistakes:
  • Starting count at 1 instead of 0
  • Assigning candidate to 0 prematurely
  • Using None for count instead of candidate
3. What will be the output of the following code snippet?
def majority_element(nums):
    count = 0
    candidate = None
    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)
    return candidate

print(majority_element([2,2,1,1,1,2,2]))
medium
A. 2
B. 1
C. None
D. Error

Solution

  1. Step 1: Trace the candidate and count updates

    Start with count=0, candidate=None. Iterate: 2 (count=0->1, candidate=2), 2 (count=2), 1 (count=1), 1 (count=0), 1 (count=1, candidate=1), 2 (count=0), 2 (count=1, candidate=2).
  2. Step 2: Final candidate after iteration

    The candidate ends as 2 after the loop finishes.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Majority element in [2,2,1,1,1,2,2] is 2 [OK]
Hint: Track candidate changes when count hits zero [OK]
Common Mistakes:
  • Not updating candidate when count is zero
  • Confusing candidate with last element
  • Assuming candidate is None if count resets
4. Identify the bug in this Moore's Voting Algorithm implementation:
def majority_element(nums):
    count = 0
    candidate = None
    for num in nums:
        if count == 0:
            candidate = num
        if num == candidate:
            count += 1
        else:
            count -= 1
    return candidate

print(majority_element([3,3,4]))
medium
A. Count increment/decrement logic is reversed
B. No bug, code works correctly
C. Candidate not updated when count is zero
D. Function does not handle empty list

Solution

  1. Step 1: Analyze candidate update and count logic

    Candidate updates when count is zero. Count increments if current num equals candidate, else decrements.
  2. Step 2: Test with input [3,3,4]

    Iteration: 3 (count=1, candidate=3), 3 (count=2), 4 (count=1). Returns candidate 3 correctly.
  3. Final Answer:

    No bug, code works correctly -> Option B
  4. Quick Check:

    Code correctly finds majority element [OK]
Hint: Check candidate update and count changes carefully [OK]
Common Mistakes:
  • Thinking candidate is not updated when count is zero
  • Confusing increment and decrement logic
  • Ignoring empty list edge case
5. Given an array where no element appears more than half the time, what will Moore's Voting Algorithm return?
Example: [1,2,3,4]
hard
A. Error or exception
B. The element with highest frequency
C. None or incorrect candidate
D. The first element of the array

Solution

  1. Step 1: Understand Moore's Voting Algorithm assumption

    The algorithm assumes a majority element exists (more than half the array). If none exists, it still returns a candidate but it may be incorrect.
  2. Step 2: Apply to example [1,2,3,4]

    No element appears more than 2 times (half of 4). The algorithm returns a candidate but it is not a true majority.
  3. Final Answer:

    None or incorrect candidate -> Option C
  4. Quick Check:

    No majority means candidate may be wrong [OK]
Hint: Algorithm assumes majority exists; else candidate may be wrong [OK]
Common Mistakes:
  • Assuming algorithm returns error if no majority
  • Thinking it returns highest frequency element always
  • Believing it returns first element by default
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard