使用stl演算法離散化:
思路:先排序,再刪除重複元素,然後就是索引元素離散化後對應的值。
1. unique():
標頭檔案為algorithm
unique的作用是「去掉」容器中相鄰元素的重複元素(不一定要求陣列有序),它會把重複的元素新增到容器末尾(所以陣列大小並沒有改變),而返回值是去重之後的尾位址.由於返回的是容器末尾,所以如果想得到去重後的size,需要減去初始位址用法:sz = unique(a ,a + n)-a; sz為容器大小
unique()是c++標準庫函式裡面的函式,其功能是去除相鄰的重複元素(只保留乙個),所以使用前需要對陣列進行排序
上面的乙個使用中已經給出該函式的乙個使用方法,對於長度為n陣列a,unique(a,a+n) - a返回的是去重後的陣列長度
那它是怎麼實現去重的呢?刪除?
不是,它並沒有將重複的元素刪除,而是把重複的元素放到陣列的最後麵藏起來了
當把原長度的陣列整個輸出來就會發現:
**如下:
1 #include2 #include3 #include4輸出的陣列如下:using
namespace
std;56
7int
n ;8
int a[1000];9
intmain()
10
16 sort(a,a+n);
17int k = unique(a,a+n) -a;
18for (int i = 0;i < n;++i)
19
2223
return0;
24 }
其中 1 2 8 9 10就是去重後的陣列,我這裡把後面「藏起來」的數也輸出了,方便理解
2、lower_bound() 函式,
在前閉後開區間進行二分查詢函式lower_bound()在first和last中的前閉後開區間進行二分查詢
返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置。
乙個陣列number序列為:4,10,11,30,69,70,96,100.
設要插入數字3,9,111.pos為要插入的位置的下標則pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。
所以,要記住:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!
一般是這樣用的
1、unique; 返回去重後的容器長度;
2\2、lower_bound 返回插入元素的位置;
離散化處理
作用 使資料的值域變小,便於根據值域構造樹狀陣列 線段樹等結構。步驟 輸入,排序,去重,索引。注意 離散化僅適用於只關注元素之間的大小關係而不關注元素本身的值。離散化處理 功能 將a陣列中的數離散化到x陣列,使值域變小 include include include using namespace ...
離散化處理
題目描述 小魚有 n 名優秀的粉絲。粉絲們得知小魚將會在一條直線上出現,打算去膜他。為了方便,粉絲們在這條直線上建立數軸。第 i 名粉絲有乙個偵查區間 li,ri 如果小魚在 j li j ri 處出現,這名粉絲將立刻發現並膜他。小魚希望膜他的人越多越好,但是他不能分身,因此只能選擇乙個位置出現。小...
離散化處理介紹
對於一串數字序列 或者乙個平面 我們要得到其中每個位置得相對位置,但這段數字可能存在間隔十分大,從而產生類似於稀疏矩陣這樣浪費空間的問題 這個形容可能不恰當 比如我們要對這段序列進行桶排序類似物的處理。這是我們可以對其進行求出相對位置 也可以理解為這個數字在這段序列中的排名 而不是原本的絕對位置,利...