Majority Element Problem

Xin chào mọi người, em đang học về sorting và time complexity,em đang làm bài toán thế này: trả về 1 nếu mảng có chứa element nào nhiều hơn 50%, trả về 0 nếu không có.
Ví dụ như là:
5
2 3 9 2 2
thì sẽ return là 1 vì có tần suất của 2 > 50%
Đây là code của em

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int get_majority_element(vector<int> &a, int left, int right) {
	
	//write your code here
	if (a.size() == 0) return -1;
	
	for (int i = 0; i < a.size(); i++)
	{
		for (int j = i + 1; j < a.size(); j++)
		{
			if (a[i] > a[j])
			{
				int temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
	int count = 1;
	int run = 1;
	int last_run = a[0];
	while (run < a.size())
	{
		if (a[run] == a[last_run])
		{
			count++;
		}
		else if (count > a.size() / 2) return 1;
		else count = 1;

		
		last_run = run;
		run++;		
	}

	if (count > a.size() / 2) return 1;
	else return -1;
	
}

int main() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (size_t i = 0; i < a.size(); ++i) {
		cin >> a[i];
	}
	cout << (get_majority_element(a, 0, a.size()) != -1) << '\n';
	return 0;
}

Cho em hỏi code này của em có phải có time complexity là O(n.logn) không ạ? Vì code này nộp lên system thì nó bảo time limit exceed.
Nếu code này của em không hiệu quả về mặt thời gian thì chỉ em cách tiếp cận khác với ạ.

Trong bài hướng dẫn hình như có chỉ theo hướng merge sorted nhưng mà em chưa làm được. Mong mọi người giúp em, em xin cảm ơn ạ. :3

2 vòng for như thế này thì O(n log n) làm sao được?

Đã code C++ sao không gọi std::sort luôn mà phải code lại làm gì :v

5 Likes

Ahihi, mình tưởng for ở trong ít hơn nên nó chạy nhanh hơn, bạn nói mình mới hiểu ra code này đi bụi rồi.

Gợi ý trong đề là ko cần sort gì cả :smiley:

7 Likes
int get_majority_element(vector<int> &a, int left, int right) {
	if (left == right) return a[left];
	if (left + 1 == right && a[left] == a[right]) return a[left];
	if (left + 1 == right && a[left] != a[right]) return -1;
	//write your code here
	int mid = (left + right) / 2;
	int m = get_majority_element(a, mid + 1, right);
	int n = get_majority_element(a, left, mid);
	if (m == n) return m;
	else
	{
		
		int countM = 0, countN = 0;
		for (int i = left; i <= right; i++)
		{
			if (a[i] == m) countM++;
			if (a[i] == n) countN++;
		}
		if (countM > (right - left + 1) / 2) return countM;
		else if (countN > (right - left + 1) / 2) return countN;
		else return -1;
	}

}

Mình làm tới đây rồi mà không biết sai cái gì nữa nè :((((. Test case nó báo sai mà mình làm sai nhiều quá nó ko cho mình biết test case luôn. Tức.
Với lại cho mình hỏi là: hàm recursion như vậy thì làm sao tính được Time Complexity ạ?

Lỗi ở chỗ:

return countM -> return m;
return countN ->return n;

tại sao Time complexity lại là O(nlogn) nhỉ? :thinking:

Bài này chỉ cần đếm số tầng đệ quy rồi nhân với số lần lặp. (có bài phải chia trường hợp tính riêng)

5 Likes

Dùng counting sort, độ phức tạp O(n)

2 Likes

https://www.enjoyalgorithms.com/blog/find-the-majority-element-in-an-array
độ phức tạp tính bằng định lý master nha mình đang học khóa này, tới bài này luôn nè.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?