# Lời giải bài Giá trị lớn nhất
###### 📌 Tags: `Counting sort` .
____
## Ý tưởng :+1:
* Đếm số lần xuất hiện của 1 giá trị . Ta sẽ có 1 tập số xuất hiện một lần việc cần làm là tìm giá trị lớn nhất trong tập số đó . Để làm được điều đó ta cần phải tạo ra một mảng đếm số lần xuất hiện của từng giá trị. $cnt[X]$ quản lý số lần xuất hiện của giá trị $X$.
>[color=lightgreen]
:::success
$cnt[a[i]] += 1$ nếu a[i] xuất hiện một 1 lần trong mảng khi ta duyệt i từ 1 -> n
* Việc đơn giản bây giờ là với từng a[i] ta nếu $cnt[a[i]] == 1$ thì số đó xuất hiện duy nhất 1 lần với mỗi lần tìm ra a[i] như vậy ta so sánh tìm giá trị max lớn nhất
:::::
* Ý tưởng không dùng đếm phân phối :
>[color=lightgreen]
:::success
Sắp xếp lại tăng dần và chạy ngược từ n về 1
với $a[n]$ nếu $a[n - 1] == a[n]$ thì số $a[n]$ không xuất hiện 1 lần
với $a[1]$ nếu $a[1] == a[2]$ thì số $a[1]$ không xuất hiện 1 lần
còn lại với $a[i]$ $(2 \le i \le n - 1)$ nếu $a[i] \neq a[i - 1]$ và $a[i] \neq a[i + 1]$ thì $a[i]$ đó xuất hiện 1 lần lập tức in ra vì đã sort còn chạy ngược nên $a[i]$ lớn nhất.
:::::
____
## Nhận xét :bulb:
+ dùng mảng bình thường thì quá bộ nhớ dùng [map](https://codelearn.io/sharing/cau-truc-du-lieu-than-thanh-mang-ten-map) thì mới là chân lý !!!
+ Tham khảo thêm ở [đây](https://www.stdio.vn/modern-cpp/stl-map-trong-c-v12lmL)
____
## Code
> **Time:** $O(nlogn)$
> **Space:** $O(n)$
> **Algo:** Counting sort.
> [color=lightgreen]
:::success
:::spoiler code
``` cpp
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll GCD(ll a1 , ll b1){
while(b1 != 0){
a1 = a1 % b1;
ll tmp = b1;
b1 = a1;
a1 = tmp;
}
return a1;
}
const ll INF = 1e18 + 7;
const ll MAXN = 1e6 + 7;
ll a[MAXN];
int n ;
map<ll ,int > cnt;
int main(){
freopen("VALUEMAX.inp" , "r" , stdin);
freopen("VALUEMAX.out" , "w" , stdout);
cin>> n;
for(int i = 1 ; i <= n ; i ++){
cin >> a[i];
cnt[a[i]] ++;
}
ll res = -INF;
for(int i = 1 ; i <= n ; i ++){
if(cnt[a[i]] == 1){
res = max(res , a[i]);
}
}
cout << res;
return 0;
}
```
:::success
:::::