在数组中删除尽可能少的数,使得数组满足“先由小到大,再由大到小”
2013-12-04 15:51
197 查看
void MyDelete(int* a, int n) { int* asc = new int ; // asc[i]表示以a[i]结尾的最长升序数的个数 int* desc = new int ; // desc[i]表示从a[i]开始的最长降序数的个数 int* inc = new int ; // 亮点,用辅助数组的巧妙之处 const int max_int = numeric_limits<int>::max(); //求解asc[]; for(int i=0; i<n; ++i) inc[i] = max_int; for(int i=0; i<n; ++i) { int low = 0, high = i; while(low <= high) { int mid = (low+high)/2; if(inc[mid] <= a[i]) low = mid + 1; else high = mid - 1; } asc[i] = high+2; inc[high+1] = a[i]; } //求解desc[]; for(int i=0; i<n; ++i) inc[i] = max_int; for(int i=n-1; i>=0; --i) { int low = 0, high = n-1-i; while(low <= high) { int mid = (low+high)/2; if(inc[mid] <= a[i]) low = mid + 1; else high = mid - 1; } desc[i] = high + 2; inc[high+1] = a[i]; } // const int max_len = max(asc[i]+desc[i]-1); 0<= i < n }
此题的巧妙之处在于,用辅助数据inc[]求解最长升序 数的个数。
题目变型: 求数组最长升序
int len = asc[0]; int index = 0; for(int j=1; j<n; ++j) if(len < asc[j]) { len = asc[j]; index = j; } vector<int> vect; for(int j=index; j>=0; --j) { if(len == asc[j]) { vect.push_back(a[j]); len--; } } copy(vect.rbegin(),vect.rend(), ostream_iterator<int>(cout," ")); cout << endl;
相关文章推荐
- 任意两个数相加等于14就可以从数组中删除这两个数,求剩余数(按由小到大排列);
- 【2015ZUFE新生赛网络同步赛G】【贪心】贪心的小猫咪 不含0的字符串删除一位使得数值尽可能大
- 330. Patching Array 给数组添上元素,使得满足存在所有1~n元素
- 编写一个程序,自定义以为数组,删除一维数组中所有相同的数,使之只剩一个。数组中的数按由小到大顺序排列,并显示运行所用时间。
- 《剑指offer》--- 在O(1)时间内删除链表结点 和 调整数组顺序使得奇数位于偶数前面
- JS删除一个数组中满足条件的所有数据
- 子数组的最大和[算法]HDU1003/HDU1231/找到这些数使得它满足:它是左边的最大值且是右边的最小值
- 计蒜客 22题 排序后的数组删除重复数字
- 蓝桥杯 ADV-119 算法提高 6-9删除数组中的0元素
- 将一个数组分成和尽可能相等的两份
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
- vector中利用迭代器删除满足一定条件的元素或者值
- JS数组方法汇总 ARRAY数组元素的添加和删除
- OC字典存入数组,输出数组中数据,并且删除小明一项,然后进行排序、现根据班级排序,班级相同的用年龄进行排序
- java提高(4)---数组增删 list删除 map删除
- 删除数组的重复元素
- C#删除数组(或顺序表等)指定位置上的元素
- 删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化(合并)为1个
- 【Codeforces Round 364 (Div 2)E】【树上路径 贪心】Connecting Universities 树上2k个点配对使得路径之和尽可能大
- As3中删除数组的重复值