由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 这道题太神奇了,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),
相关主题
求教移除数组重复元素的时间复杂度!!讨论一道老题:分离数组中的正负数 (转载)
一个面题一个找duplicate element in an array的问题
荷兰国旗问题的扩展来二题
被基础题搞挂了请教一道面试题,跟数组排序有关
请大家帮忙分析一下这个程序的时间复杂性为啥这个swap不可以?
find the first missing positive integer.请教几个电面题
quicksort到底以哪个为准啊how to solve this google interview question
FB的这道题怎么答?一个容易记忆的permutation算法
相关话题的讨论汇总
话题: int话题: 复杂度话题: 交换话题: temp话题: 下标
进入JobHunting版参与讨论
1 (共1页)
w******1
发帖数: 520
1
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂
度O(1),使用交换,而且一次只能交换两个数.(华为)
分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。
但这个算法的时间复杂度如何证明是O(n)呢?
#include
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i < len; )
{
if ( a[i] != i + 1)//下标和值不满足对应关系
{
temp = a[a[i] - 1]; //不相等的话就把a[i]交换到与索引相应的位置
a[a[i] - 1] = a[i];
a[i] = temp;
}
else
i++; // 保存,以后此值不会再动了
}
for (int j = 0; j < len; j++)
cout< return 0;
}
w******1
发帖数: 520
2
排序怎么可能是o(n)呢? 怎么看都不像啊。
d*******8
发帖数: 785
3
这个可以0(N)的,因为是1-n个数在n大数组里,

【在 w******1 的大作中提到】
: 有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂
: 度O(1),使用交换,而且一次只能交换两个数.(华为)
: 分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。
: 但这个算法的时间复杂度如何证明是O(n)呢?
: #include
: int main()
: {
: int a[] = {10,6,9,5,2,8,4,7,1,3};
: int len = sizeof(a) / sizeof(int);
: int temp;

m******9
发帖数: 968
4
既然是1到n的值域, 又放在大小为n的数组里, 把数组重新写一遍就可以,不需要排序吧
d*******8
发帖数: 785
5
但是这个代码是错的,应该是交换直到 A[i] = i+1
void sort(int A[], int n)
{
for(int i=0;i {
while(A[i]!= i+1 )
swap(A[i], A[A[i]-1]);
}
}
虽然是For循环里嵌套while,但是
因为每个数至多被Swap2次,所以是0(N)

【在 d*******8 的大作中提到】
: 这个可以0(N)的,因为是1-n个数在n大数组里,
w******1
发帖数: 520
6
我带入值

i = 0 的时候, 这几个就做了好几次啊。
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
d*******8
发帖数: 785
7
题目要求你只用Swap操作吧,没有赋值,呵呵

【在 m******9 的大作中提到】
: 既然是1到n的值域, 又放在大小为n的数组里, 把数组重新写一遍就可以,不需要排序吧
B*****t
发帖数: 335
8
i每次增加1至少会排好一个数, i取值从0到n-1, 复杂度O(n)

【在 w******1 的大作中提到】
: 有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂
: 度O(1),使用交换,而且一次只能交换两个数.(华为)
: 分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。
: 但这个算法的时间复杂度如何证明是O(n)呢?
: #include
: int main()
: {
: int a[] = {10,6,9,5,2,8,4,7,1,3};
: int len = sizeof(a) / sizeof(int);
: int temp;

g*******y
发帖数: 1930
9
这个是对的
对1-n的in place O(n)是可以做到的,以前google有个面试题是停车场有1-N编号的N辆车乱序,1
个空位,要求sort好,跟这个题基本上是一样的。

【在 d*******8 的大作中提到】
: 但是这个代码是错的,应该是交换直到 A[i] = i+1
: void sort(int A[], int n)
: {
: for(int i=0;i: {
: while(A[i]!= i+1 )
: swap(A[i], A[A[i]-1]);
: }
: }
: 虽然是For循环里嵌套while,但是

d*******8
发帖数: 785
10
赞小尾羊,我要烧香拜佛求狗狗问我我会的题目..

辆车乱序,1

【在 g*******y 的大作中提到】
: 这个是对的
: 对1-n的in place O(n)是可以做到的,以前google有个面试题是停车场有1-N编号的N辆车乱序,1
: 个空位,要求sort好,跟这个题基本上是一样的。

相关主题
find the first missing positive integer.讨论一道老题:分离数组中的正负数 (转载)
quicksort到底以哪个为准啊一个找duplicate element in an array的问题
FB的这道题怎么答?来二题
进入JobHunting版参与讨论
m******9
发帖数: 968
11
其实这个题另外一个写法就是,将从头到尾swap的过程, 做2次就可以了:
比如:
这个题目另外2个变形就是: 找missing和duplicate
r****o
发帖数: 1950
12
这种sort是不是得要1-n全排满,且每个元素只有一个才行阿。

辆车乱序,1

【在 g*******y 的大作中提到】
: 这个是对的
: 对1-n的in place O(n)是可以做到的,以前google有个面试题是停车场有1-N编号的N辆车乱序,1
: 个空位,要求sort好,跟这个题基本上是一样的。

r**u
发帖数: 1567
13
swap needs assign value, isn't it?

【在 d*******8 的大作中提到】
: 题目要求你只用Swap操作吧,没有赋值,呵呵
c**********r
发帖数: 472
14
雷死了,这也叫题。。。。。。。。。
直接输出1到n。
w******1
发帖数: 520
15
这个题目另外2个变形就是: 找missing和duplicate
在哪个地方加入这个判断呢?
r****o
发帖数: 1950
16
还是没搞明白为什么要做2次啊。

【在 m******9 的大作中提到】
: 其实这个题另外一个写法就是,将从头到尾swap的过程, 做2次就可以了:
: 比如:
: 这个题目另外2个变形就是: 找missing和duplicate

a********n
发帖数: 369
17
第一次把第一个数和下标为1的数交换,这样第一个数就对了,第二次把第二个数和下标为2的数交换,
排好第二个数,这样n次就能排好n个数吧~
PS: 你申请full time还是intern?~

【在 w******1 的大作中提到】
: 有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂
: 度O(1),使用交换,而且一次只能交换两个数.(华为)
: 分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。
: 但这个算法的时间复杂度如何证明是O(n)呢?
: #include
: int main()
: {
: int a[] = {10,6,9,5,2,8,4,7,1,3};
: int len = sizeof(a) / sizeof(int);
: int temp;

w******1
发帖数: 520
18
这个不是面试遇到的题,
是在网上看到的题目。

下标为2的数交换,

【在 a********n 的大作中提到】
: 第一次把第一个数和下标为1的数交换,这样第一个数就对了,第二次把第二个数和下标为2的数交换,
: 排好第二个数,这样n次就能排好n个数吧~
: PS: 你申请full time还是intern?~

r****o
发帖数: 1950
19
请问,为什么这个从头到尾做2遍swap就可以了呢?

【在 m******9 的大作中提到】
: 其实这个题另外一个写法就是,将从头到尾swap的过程, 做2次就可以了:
: 比如:
: 这个题目另外2个变形就是: 找missing和duplicate

b******v
发帖数: 1493
20
已经知道是1,2,...,n那么直接写入a[0]=1, a[1]=2, ..., a[n-1]=n不就行了吗?

【在 w******1 的大作中提到】
: 有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂
: 度O(1),使用交换,而且一次只能交换两个数.(华为)
: 分析:数组的特点是值和下标满足一定的关系,以此作为交换的终止条件。
: 但这个算法的时间复杂度如何证明是O(n)呢?
: #include
: int main()
: {
: int a[] = {10,6,9,5,2,8,4,7,1,3};
: int len = sizeof(a) / sizeof(int);
: int temp;

相关主题
请教一道面试题,跟数组排序有关how to solve this google interview question
为啥这个swap不可以?一个容易记忆的permutation算法
请教几个电面题看看这道题
进入JobHunting版参与讨论
d**e
发帖数: 6098
21
不明为什么swap两次?
就lz的例子 10,6,9,5,2,8,4,7,1,3
i = 0时,while就不止两次

【在 d*******8 的大作中提到】
: 但是这个代码是错的,应该是交换直到 A[i] = i+1
: void sort(int A[], int n)
: {
: for(int i=0;i: {
: while(A[i]!= i+1 )
: swap(A[i], A[A[i]-1]);
: }
: }
: 虽然是For循环里嵌套while,但是

r****o
发帖数: 1950
22
请问这两个找missing和duplicate的变形具体是怎么回事,多谢。

【在 m******9 的大作中提到】
: 其实这个题另外一个写法就是,将从头到尾swap的过程, 做2次就可以了:
: 比如:
: 这个题目另外2个变形就是: 找missing和duplicate

z*********h
发帖数: 133
23
For missing和duplicate,just calculate the sum

【在 r****o 的大作中提到】
: 请问这两个找missing和duplicate的变形具体是怎么回事,多谢。
k***e
发帖数: 556
24
you may have satellite data

【在 b******v 的大作中提到】
: 已经知道是1,2,...,n那么直接写入a[0]=1, a[1]=2, ..., a[n-1]=n不就行了吗?
r****o
发帖数: 1950
25
what is satellite data?

【在 k***e 的大作中提到】
: you may have satellite data
s********f
发帖数: 510
26
重写一遍需要O(N)的space,这里规定了只能用交换

既然是1到n的值域, 又放在大小为n的数组里, 把数组重新写一遍就可以,不需要排序吧

【在 m******9 的大作中提到】
: 既然是1到n的值域, 又放在大小为n的数组里, 把数组重新写一遍就可以,不需要排序吧
s******9
发帖数: 84
27
赞!

【在 c**********r 的大作中提到】
: 雷死了,这也叫题。。。。。。。。。
: 直接输出1到n。

1 (共1页)
进入JobHunting版参与讨论
相关主题
一个容易记忆的permutation算法请大家帮忙分析一下这个程序的时间复杂性
看看这道题find the first missing positive integer.
一道面试题quicksort到底以哪个为准啊
问一道面世题FB的这道题怎么答?
求教移除数组重复元素的时间复杂度!!讨论一道老题:分离数组中的正负数 (转载)
一个面题一个找duplicate element in an array的问题
荷兰国旗问题的扩展来二题
被基础题搞挂了请教一道面试题,跟数组排序有关
相关话题的讨论汇总
话题: int话题: 复杂度话题: 交换话题: temp话题: 下标