---
# System prepended metadata

title: Lời giải bài   Giá trị lớn nhất

---

# 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
:::::