d*w
2 楼
You are given an unsorted array A of n elements, now construct an array B
for which
B[i] = A[j] where j is the least number such that A[j] > A[i] and j>i
if such a j does not exist B[i] = -1
Eg:
A={1,3,5,7,6,4,8}
B = {3 5 7 8 8 8 -1}
for which
B[i] = A[j] where j is the least number such that A[j] > A[i] and j>i
if such a j does not exist B[i] = -1
Eg:
A={1,3,5,7,6,4,8}
B = {3 5 7 8 8 8 -1}
g*i
3 楼
一直用Unibeast,现在才发现Clover真是领先一代。Trick就是研究下用哪些EFI
driver.
用了一年Yosemite, Xeon四核依然卡。
10.11流畅的像10.8,10.9的样子。
driver.
用了一年Yosemite, Xeon四核依然卡。
10.11流畅的像10.8,10.9的样子。
I*W
4 楼
学校,导师,获奖??,这些都很重要。
s*l
5 楼
void next_record(int* a, int* b, int n)
{
/* assert(n>0); */
int i,j,k=0;
int m = a[0];
for (i=1;i
m = a[i];
for (j=k;jk = j;
}
}
// for (j=k;j
if (k==n-1) return;
next_record(a+k+1,b+k+1,n-k-1);
}
【在 d********w 的大作中提到】
: You are given an unsorted array A of n elements, now construct an array B
: for which
: B[i] = A[j] where j is the least number such that A[j] > A[i] and j>i
: if such a j does not exist B[i] = -1
: Eg:
: A={1,3,5,7,6,4,8}
: B = {3 5 7 8 8 8 -1}
C*4
6 楼
upenn,导师David J Srolovitz,在国家实验室做有名字的博后。
l*g
7 楼
你程序里的m不能这么用。问题里的example你的code刚好可以适用,但下面的case就不
行了
{1, 2, 10, 3, 4, 5}
你算出的结果是:{ 2, 10, -1, -1, -1, -1}
但实际应该是:{ 2, 10, -1, 4, 5, -1}
为你修改一下:
void next_record(int *a, int *b, int len)
{
// skip some boundary checks here
int k = 0;
b[len-1] = -1;
for (int i = 0; i < len-1; i++)
{
if (a[i] < a[k])
{
b[i] = a[k];
}
else
{
bool found = false;
for (int j = i+1; j < len; j++)
{
if (a[j] > a[i])
{
b[i] = a[j];
found = true;
k = j;
break;
}
}
if (!found)
{
b[i] = -1;
k = i+1;
}
}
}
return;
}
【在 s*********l 的大作中提到】
:
: void next_record(int* a, int* b, int n)
: {
: /* assert(n>0); */
: int i,j,k=0;
: int m = a[0];
: for (i=1;i : if (a[i]>m){
: m = a[i];
: for (j=k;j
行了
{1, 2, 10, 3, 4, 5}
你算出的结果是:{ 2, 10, -1, -1, -1, -1}
但实际应该是:{ 2, 10, -1, 4, 5, -1}
为你修改一下:
void next_record(int *a, int *b, int len)
{
// skip some boundary checks here
int k = 0;
b[len-1] = -1;
for (int i = 0; i < len-1; i++)
{
if (a[i] < a[k])
{
b[i] = a[k];
}
else
{
bool found = false;
for (int j = i+1; j < len; j++)
{
if (a[j] > a[i])
{
b[i] = a[j];
found = true;
k = j;
break;
}
}
if (!found)
{
b[i] = -1;
k = i+1;
}
}
}
return;
}
【在 s*********l 的大作中提到】
:
: void next_record(int* a, int* b, int n)
: {
: /* assert(n>0); */
: int i,j,k=0;
: int m = a[0];
: for (i=1;i
: m = a[i];
: for (j=k;j
I*W
8 楼
upenn和uiuc差不多级别的了,没啥大区别。打听一下哪个老板对学生支持就去哪个。
,
,
C*4
10 楼
uiuc的话应该是做理论/计算生物物理,教职是不是多一点?
s*l
13 楼
谢谢发现这个问题,我错误地把题目理解成找下一个比所有当前元素都大的record(纪录
), 所以函数也取名为next_record.
现在把最后一句
从
for (j=k;j 改成
b[k] = -1;
if (k==n-1) return;
next_record(a+k+1,b+k+1,n-k-1);
【在 l*****g 的大作中提到】
: 你程序里的m不能这么用。问题里的example你的code刚好可以适用,但下面的case就不
: 行了
: {1, 2, 10, 3, 4, 5}
: 你算出的结果是:{ 2, 10, -1, -1, -1, -1}
: 但实际应该是:{ 2, 10, -1, 4, 5, -1}
: 为你修改一下:
: void next_record(int *a, int *b, int len)
: {
: // skip some boundary checks here
: int k = 0;
), 所以函数也取名为next_record.
现在把最后一句
从
for (j=k;j
b[k] = -1;
if (k==n-1) return;
next_record(a+k+1,b+k+1,n-k-1);
【在 l*****g 的大作中提到】
: 你程序里的m不能这么用。问题里的example你的code刚好可以适用,但下面的case就不
: 行了
: {1, 2, 10, 3, 4, 5}
: 你算出的结果是:{ 2, 10, -1, -1, -1, -1}
: 但实际应该是:{ 2, 10, -1, 4, 5, -1}
: 为你修改一下:
: void next_record(int *a, int *b, int len)
: {
: // skip some boundary checks here
: int k = 0;
C*4
14 楼
我本科是纯理论/计算凝聚态物理背景的,没什么偏好。理论/计算生物物理是不是比纳
米材料计算也要好一点?
米材料计算也要好一点?
i*d
15 楼
有点类似max rectangle in histogram
只不过这个是找后面第一个比自己大的
可以O(n)
假设C[i] = min{ j | A[j]>A[i] && j > i}
C[n-1] = -1
for i <= n-2 ~ 0:
j = i+1;
while (j!=-1 && A[j]<=A[i])
j = C[j]
C[i] = j
就是处理到A[i]的时候,先看A[i+1],符合最好,不符合的话说明A[i+1] <= A[i]
那下一个满足要求的肯定至少是C[i+1]
最后根据C转存到A就可以了
【在 d********w 的大作中提到】
: You are given an unsorted array A of n elements, now construct an array B
: for which
: B[i] = A[j] where j is the least number such that A[j] > A[i] and j>i
: if such a j does not exist B[i] = -1
: Eg:
: A={1,3,5,7,6,4,8}
: B = {3 5 7 8 8 8 -1}
只不过这个是找后面第一个比自己大的
可以O(n)
假设C[i] = min{ j | A[j]>A[i] && j > i}
C[n-1] = -1
for i <= n-2 ~ 0:
j = i+1;
while (j!=-1 && A[j]<=A[i])
j = C[j]
C[i] = j
就是处理到A[i]的时候,先看A[i+1],符合最好,不符合的话说明A[i+1] <= A[i]
那下一个满足要求的肯定至少是C[i+1]
最后根据C转存到A就可以了
【在 d********w 的大作中提到】
: You are given an unsorted array A of n elements, now construct an array B
: for which
: B[i] = A[j] where j is the least number such that A[j] > A[i] and j>i
: if such a j does not exist B[i] = -1
: Eg:
: A={1,3,5,7,6,4,8}
: B = {3 5 7 8 8 8 -1}
t*r
18 楼
好奇问一嘴,Srolovitz的学生,还在国家实验室,难道你在LANL?
Director fellow?
Director fellow?
f*g
19 楼
2 cents:
从最后一个开始scan。
并用一个stack维持一个有序递增数列。
O(n)。
有待验证
从最后一个开始scan。
并用一个stack维持一个有序递增数列。
O(n)。
有待验证
l*a
23 楼
一开始没往O(n)的算法想。
还欠火候。
还欠火候。
s*l
29 楼
嗯,想起来,以前看过这道题的
http://discuss.joelonsoftware.com/default.asp?interview.11.8033
【在 l*****g 的大作中提到】
: 赞,这个是正解
: 有个小bug, while loop应该改成这样
: while(a[j] <= a[j])
: {
: j = C[j];
: if (j == -1)
: break;
: }
http://discuss.joelonsoftware.com/default.asp?interview.11.8033
【在 l*****g 的大作中提到】
: 赞,这个是正解
: 有个小bug, while loop应该改成这样
: while(a[j] <= a[j])
: {
: j = C[j];
: if (j == -1)
: break;
: }
t*d
31 楼
can you prove it's O(n)?
g*s
32 楼
ohh. b[n] can be used as stack.
So, loop twice, it can be solved in O(n) with O(1) extra space.
So, loop twice, it can be solved in O(n) with O(1) extra space.
l*l
33 楼
void nextLarger(int a[],int b[],int n)
{
stack st;
st.push(0);
for (int i=1;i {
while (!st.empty() && a[i]> a[st.top()])
{
b[st.top()] = i;
st.pop();
}
st.push(i);
}
while (!st.empty())
{
b[st.top()] = -1;
st.pop();
}
}
{
stack
st.push(0);
for (int i=1;i
while (!st.empty() && a[i]> a[st.top()])
{
b[st.top()] = i;
st.pop();
}
st.push(i);
}
while (!st.empty())
{
b[st.top()] = -1;
st.pop();
}
}
g*s
34 楼
this one need extra O(n) space. But in fact, it can be polished to use b[]
as the stack at the same time.
So, it can be solved in O(n) by extra O(1) space.
【在 l******l 的大作中提到】
: void nextLarger(int a[],int b[],int n)
: {
: stack st;
: st.push(0);
: for (int i=1;i : {
: while (!st.empty() && a[i]> a[st.top()])
: {
: b[st.top()] = i;
: st.pop();
as the stack at the same time.
So, it can be solved in O(n) by extra O(1) space.
【在 l******l 的大作中提到】
: void nextLarger(int a[],int b[],int n)
: {
: stack
: st.push(0);
: for (int i=1;i
: while (!st.empty() && a[i]> a[st.top()])
: {
: b[st.top()] = i;
: st.pop();
相关阅读
装了iClound之后为啥我电脑Outlook上的Calendar事件提醒都不见了???iphone屏幕怎么在水平方向锁定?apple 丢了nasa ipad的单子Ipad2 ATT 3G+WiFi, can I use 3G service in China?looking into the 4G请推荐iphone用的词典Iphone4进水了是找ATT还是apple store啊我是IPHONE寡妇 (转载)苹果该歇口气了吧?Mercedes-Benz gets serious about iPhone 4S with Siri integrationIOS 5.1 什么时候出?iPad3分辨率1920X1080iPad的retina[业界]华为rocks今天晚上这种concept的片子是怎么拍出来的啊两分钟看苹果产品30年请问,这个Retina屏幕是什么?aapl 新高新手问题 ATT iphone 4, ios 5.0.1 firmware 04.11.08越狱问题