给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
来源:互联网 发布:for vb 编辑:程序博客网 时间:2024/05/18 17:24
http://blog.csdn.net/yysdsyl/article/details/5419149#cpp
题目:
给定数组Arr[n],对于其中的每个元素Arr[i](0=<i<n),在Arr[0...i-1]中找到元素Arr[k],Arr[k]满足Arr[k]>Arr[i],并且i-k值最小(即最靠近)。
要求O(n)时间内找出Arr中所有元素对应的Arr[k]的位置。
ex,
src[]: 9, 5, 2, 4, 7
dst[]: -1,0, 1, 1, 0
思路:
借助于栈来实现,从后向前遍历数组,while栈顶元素小于当前遍历的数组元素,则更新dst,并pop。
参见下面代码
代码:
- #include <iostream>
- #include <stack>
- #include <iterator>
- using namespace std;
- typedef struct withindex
- {
- int value;
- int index;
- }WithIndexSt;
- void NearestNumberGreaterThanCurrent(int src[], int dst[], int n)
- {
- stack<WithIndexSt> m_stack;
- for(int i = n - 1; i >= 0; i--)
- {
- while(!m_stack.empty())
- {
- if(m_stack.top().value < src[i])
- {
- dst[m_stack.top().index] = i;
- m_stack.pop();
- }
- else
- break;
- }
- WithIndexSt tmpst = {src[i], i};
- m_stack.push(tmpst);
- }
- dst[0] = -1;
- }
- int main()
- {
- int src[] = {9, 5, 2, 4, 7};
- int nsize = sizeof(src)/sizeof(int);
- int* dst = new int[nsize];
- NearestNumberGreaterThanCurrent(src, dst, nsize);
- copy(src, src+nsize, ostream_iterator<int>(cout, "/t"));
- cout<<endl;
- copy(dst, dst+nsize, ostream_iterator<int>(cout, "/t"));
- delete[] dst;
- return 0;
- }
上面的思路比较复杂,我是这样实现的:
void minDist(int *a, int *b, int n) { b[0] = -1; for (int i = 1; i <n ;++i) { int j = i - 1; while(j >=0 && a[j] <= a[i]) j = b[j]; b[i] = j; }}
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 面试题精选(85):给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 主元素问题(判断数组是否出现主元素,O(n)时间内找出主元素,主元素出现次数)
- 在O(n)时间内找出最小的k个元素
- 编写程序,在O(n)时间内从数组x[0..n-1]中找出第k个最小的元素?
- 找出元素 item 在给定数组 arr 中的位置
- 计算给定数组 arr 中所有元素的总和
- 从有n个元素的数组中找出出现次数大于n/3次的元素
- 给定一个整数数组,1≤a [i]≤n(n =数组的大小),一些元素出现两次,其他出现一次 查找在该数组中出现两次的所有元素
- 在给定的数组中找出两个元素和为给定值的所有元素对
- 在给定的数组中找出两个元素和为给定值的所有元素对
- 给定一个整型数组,求数组元素大于等于所有元素平均值的元素个数
- Leetcode238. O(n)并且不能使用除法计算数组每个元素除了它本身的所有元素的积
- 算法之找出数组中出现次数大于n/m的元素
- 找出数组中重复的元素,或者丢失的元素,前提,数组长度N,元素为1到N
- N个元素的数组中找出出现多于N/2次的数(主元素)
- Java基础面试题系列五(编程篇)
- Linux下V4L2编程小结--吴老师
- div+css
- Qt里使用QSplashScreen类制作Splash启动窗口
- RFC1542:Clarifications and Extensions for the Bootstrap Protocol
- 给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
- 多重继承小结
- Qt 动态加载 dll
- android Toast大全(五种情形)建立属于你自己的Toast
- 内核模块
- 传统文件系统与NoSQL分布式存储的块存储技术对比(1)
- 程序员经典面试题及答案2
- 提升jQuery性能的十个技巧
- lenovo v480c(无线网卡型号:Intel 2230 BGN) backtrack linux下实现无线上网