2 条题解

  • 0
    @ 2025-9-12 11:26:39
    • sort()unique()erase()lower_bound() 离散化一个数组
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0); cout.tie(0);
    
    	int n = 6;
    	vector<int> a = {15, 14, 14, 16, 11, 11};
    	
    	// 把 a 数组复制一遍到 c 数组, 用于离散化
    	vector<int> c = a;
    	
    	cout << "原数组:\n";
    	for (int i = 0; i < (int) c.size(); i++) cout << c[i] << ' ';
    	cout << "\n\n";
    	
    	// 将 c 从小到大排序, c = [11, 11, 14, 14, 15, 16]
    	sort(c.begin(), c.end());
    	
    	cout << "排序后:\n";
    	for (int i = 0; i < (int) c.size(); i++) cout << c[i] << ' ';
    	cout << "\n\n";
    	
    	// unique() 用于将一个排好序的数组去重
    	// 把可以删除的数放到后面, 并返回第一个可以删除的数的迭代器
    	auto it = unique(c.begin(), c.end());
    	
    	cout << "unique() 后:\n";
    	for (int i = 0; i < (int) c.size(); i++) cout << c[i] << ' ';
    	cout << "\n\n";
    	
    	// 将 c 后面可以删除的数删除
    	c.erase(it, c.end());
    	
    	cout << "删除重复的数后:\n";
    	for (int i = 0; i < (int) c.size(); i++) cout << c[i] << ' ';
    	cout << "\n\n";
    	
    	// 排序去重后, c 数组中数的个数
    	int e = c.size();
    	cout << "排序去重后数组的大小= " << e << "\n\n";
    	
    	for (int i = 0; i < (int) a.size(); i++) {
    		// 把 a[i] 离散化到 [1, e]
    		a[i] = lower_bound(c.begin(), c.end(), a[i]) - c.begin() + 1;
    	}
    	
    	cout << "离散化后:\n";
    	for (int i = 0; i < (int) a.size(); i++) cout << a[i] << ' ';
    	cout << "\n\n";
    	
    	
    	/*
    	将 a 数组 离散化, 可以简写成下面的样子:
    	vector<int> c = a;
    	sort(c.begin(), c.end());
    	c.erase(unique(c.begin(), c.end()), c.end());
    	for (int i = 0; i < n; i++) {
    		a[i] = lower_bound(c.begin(), c.end(), a[i]) - c.begin() + 1;
    	}
    	*/
    	return 0;
    }
    

    信息

    ID
    114
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    58
    已通过
    11
    上传者