由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 这题有最优解法么
相关主题
有人同看First Missing Positive 吗?[算法] unsorted array
unsorted int array怎么找到第一个大于0,并且不在此array的数next larger element in unsorted array
问个面试题昨天面试的一道题,find k missing numbers
divide array into two, sum of difference is min in O(N)re: 面试归来,上面经回馈各位战友
优步面试,哎。。。问个google面试题
Amazon电面面经求教 合并两数组 并排除重复
昨天有人讲过的啥de啥的是怎么回事有人知道么新鲜Amazon面经
算法--找一个unsorted array的largest and second largest 最Quick selection for k unsorted arrays
相关话题的讨论汇总
话题: int话题: return话题: least话题: temp话题: arr
进入JobHunting版参与讨论
1 (共1页)
H***e
发帖数: 476
1
O(n) time, O(1) space?
题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
integer。
比如[1,2,0] return 3, [3,4,-1,1] return 2
c****9
发帖数: 164
2
有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
i]!=i的就是
//Input Array:get first positive number that is not in the array
int getfirstpositive(int* a, int len)
{
int i=0;
while(i {
int m= a[i];
if (m>=0&&m {
int tmp;
tmp = a[m];
a[m] = m;
a[i] = tmp;
}
else
i++;
}
for (i=1;i {
if (a[i]!=i)
{
return i;
}
}
if(a[0] == len)
return len+1;
else
return len;
}
s******n
发帖数: 3946
3
[3,4,-1,1] 下标越界

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
c****9
发帖数: 164
4
我试了下没有越界,因为会跳过负数

【在 s******n 的大作中提到】
: [3,4,-1,1] 下标越界
:
: a[

s******n
发帖数: 3946
5
跳过就好了

【在 c****9 的大作中提到】
: 我试了下没有越界,因为会跳过负数
w****o
发帖数: 2260
6
如果[ 4 1 2 3 ], 上面的代码返回是4,正确应是5, 所以还应有一个判断,是不是a[0
]==n

【在 s******n 的大作中提到】
: 跳过就好了
e***l
发帖数: 710
7
[2,1,2] 死循环?
w****o
发帖数: 2260
8
这个不会的。
a[0]=2, a[2]=2, 所以他们不会swap

【在 e***l 的大作中提到】
: [2,1,2] 死循环?
s*****r
发帖数: 773
9
那如果这样呢 1, 100, 1000,会越界么? 那要多少space?

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
c***g
发帖数: 472
10
用partition,然后计算个数?
但是,负数怎么处理呢?

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

相关主题
Amazon电面面经[算法] unsorted array
昨天有人讲过的啥de啥的是怎么回事有人知道么next larger element in unsorted array
算法--找一个unsorted array的largest and second largest 最昨天面试的一道题,find k missing numbers
进入JobHunting版参与讨论
c****9
发帖数: 164
11
嗯,对的。确实有这个bug,已改

[0

【在 w****o 的大作中提到】
: 如果[ 4 1 2 3 ], 上面的代码返回是4,正确应是5, 所以还应有一个判断,是不是a[0
: ]==n

c****9
发帖数: 164
12
不会越界,因为跳过了,不需要额外是space, 是通过判断index的得到结论的,因为n
个元素那个最小的正数肯定在0到n+1的范围。

【在 s*****r 的大作中提到】
: 那如果这样呢 1, 100, 1000,会越界么? 那要多少space?
:
: a[

R******9
发帖数: 267
13
int SmallestMissingPositive(int a[], int n)
{
int i = 0;
int min = MAXINT;
while(i<=n-1){
if(a[i]<=0 || a[i]>n){
a[i] = a[n-1];
n--;
}else{
min = min i++;
}
}
return min;
}

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

n*s
发帖数: 752
14
what if a={100}

【在 R******9 的大作中提到】
: int SmallestMissingPositive(int a[], int n)
: {
: int i = 0;
: int min = MAXINT;
: while(i<=n-1){
: if(a[i]<=0 || a[i]>n){
: a[i] = a[n-1];
: n--;
: }else{
: min = min
H*****1
发帖数: 4815
15
如果是这样,[3, 4, -1, 1]会返回5
答案应该是2

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
m******6
发帖数: 82
16
O(n)?

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
G**********s
发帖数: 70
17
此题是 given int array in range [1,N],find missing integer的变形吧,
in my opinion
扫描的时候, 用bitmap来mark seen positive ints,略过non-positive的integer,
assume 有k个positive ints, O(n) mark positives,O(k) find first missing int,
gives us O(n+k).
不知道这样做是否妥当和最有呢

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

g**********y
发帖数: 14569
18
这个有问题,过不了test case:
{5, 5, 5, 5, 5}
{1,2,0}
{3,4,-1,1}

【在 R******9 的大作中提到】
: int SmallestMissingPositive(int a[], int n)
: {
: int i = 0;
: int min = MAXINT;
: while(i<=n-1){
: if(a[i]<=0 || a[i]>n){
: a[i] = a[n-1];
: n--;
: }else{
: min = min
g**********y
发帖数: 14569
19
public int find(int[] a) {
int least = a.length;

for (int i=a.length-1; i>=0; i--) {
if (a[i]<=0 || a[i]>i+1) {
least = i;
continue;
}

if (a[i] != i+1) {
if (a[i] == a[a[i]-1]) {
least = i;
}
else {
int t = a[i]-1;
a[i] = a[t];
a[t] = t+1;
i++;
}
}
}

return least+1;
}
A**u
发帖数: 2458
20
大牛,看不懂
可否详解

【在 g**********y 的大作中提到】
: public int find(int[] a) {
: int least = a.length;
:
: for (int i=a.length-1; i>=0; i--) {
: if (a[i]<=0 || a[i]>i+1) {
: least = i;
: continue;
: }
:
: if (a[i] != i+1) {

相关主题
re: 面试归来,上面经回馈各位战友新鲜Amazon面经
问个google面试题Quick selection for k unsorted arrays
求教 合并两数组 并排除重复问两道google题
进入JobHunting版参与讨论
c*******2
发帖数: 173
21
方法挺好的,但是好像空间不是O(1)吧

int,

【在 G**********s 的大作中提到】
: 此题是 given int array in range [1,N],find missing integer的变形吧,
: in my opinion
: 扫描的时候, 用bitmap来mark seen positive ints,略过non-positive的integer,
: assume 有k个positive ints, O(n) mark positives,O(k) find first missing int,
: gives us O(n+k).
: 不知道这样做是否妥当和最有呢

g**********y
发帖数: 14569
22
http://www.mitbbs.com/article0/JobHunting/31902917_0.html

【在 A**u 的大作中提到】
: 大牛,看不懂
: 可否详解

s****e
发帖数: 638
23
扫描一遍数组,<=0的数字不管,大于数组长度的数字扔掉,其余的重新排列在数组中

扫描第二遍,返回第一个小于等于0的数组index。
int findPosMissing(int* arr, int size) {
for (int i=0; i if (arr[i] == i+1) continue;
int temp = arr[i];
arr[i] = 0;
int temp1;
while (true) {
if (temp <=0 ) break;
if (temp > size ) break;
if (arr[temp-1] == temp) break;
temp1 = arr[temp-1];
arr[temp-1]= temp;
temp = temp1;
}
}
for (int i=0; i if (arr[i]<=0){
return i+1;
}
}
return size+1;
}

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

P*A
发帖数: 189
24
if (arr[i]<=0) 有问题,没考虑arr[i]>n
应该改成 if(arr[i]!=i+1)

【在 s****e 的大作中提到】
: 扫描一遍数组,<=0的数字不管,大于数组长度的数字扔掉,其余的重新排列在数组中
: 。
: 扫描第二遍,返回第一个小于等于0的数组index。
: int findPosMissing(int* arr, int size) {
: for (int i=0; i: if (arr[i] == i+1) continue;
: int temp = arr[i];
: arr[i] = 0;
: int temp1;
: while (true) {

i**********e
发帖数: 1145
25
他代码没问题,这里handle了:
if (temp <=0 ) break;
if (temp > size ) break;
另外随手写了一个,基于 cx3959 的思路(除了他没有handle n==0 这个状况之外,他
这个思路是挺简洁的):
int firstMissingPositive(int A[], int n) {
if (n == 0) return 1;
for (int i = 0; i < n; i++)
while (A[i] >= 0 && A[i] < n && A[i] != A[A[i]])
swap(A[i], A[A[i]]);
for (int i = 1; i < n; i++)
if (A[i] != i) return i;
return (A[0] == n) ? n+1 : n;
}

【在 P*A 的大作中提到】
: if (arr[i]<=0) 有问题,没考虑arr[i]>n
: 应该改成 if(arr[i]!=i+1)

H***e
发帖数: 476
26
O(n) time, O(1) space?
题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
integer。
比如[1,2,0] return 3, [3,4,-1,1] return 2
c****9
发帖数: 164
27
有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
i]!=i的就是
//Input Array:get first positive number that is not in the array
int getfirstpositive(int* a, int len)
{
int i=0;
while(i {
int m= a[i];
if (m>=0&&m {
int tmp;
tmp = a[m];
a[m] = m;
a[i] = tmp;
}
else
i++;
}
for (i=1;i {
if (a[i]!=i)
{
return i;
}
}
if(a[0] == len)
return len+1;
else
return len;
}
s******n
发帖数: 3946
28
[3,4,-1,1] 下标越界

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
c****9
发帖数: 164
29
我试了下没有越界,因为会跳过负数

【在 s******n 的大作中提到】
: [3,4,-1,1] 下标越界
:
: a[

s******n
发帖数: 3946
30
跳过就好了

【在 c****9 的大作中提到】
: 我试了下没有越界,因为会跳过负数
相关主题
问一个merge k sorted array的问题unsorted int array怎么找到第一个大于0,并且不在此array的数
请问两道题问个面试题
有人同看First Missing Positive 吗?divide array into two, sum of difference is min in O(N)
进入JobHunting版参与讨论
w****o
发帖数: 2260
31
如果[ 4 1 2 3 ], 上面的代码返回是4,正确应是5, 所以还应有一个判断,是不是a[0
]==n

【在 s******n 的大作中提到】
: 跳过就好了
e***l
发帖数: 710
32
[2,1,2] 死循环?
w****o
发帖数: 2260
33
这个不会的。
a[0]=2, a[2]=2, 所以他们不会swap

【在 e***l 的大作中提到】
: [2,1,2] 死循环?
s*****r
发帖数: 773
34
那如果这样呢 1, 100, 1000,会越界么? 那要多少space?

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
c***g
发帖数: 472
35
用partition,然后计算个数?
但是,负数怎么处理呢?

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

c****9
发帖数: 164
36
嗯,对的。确实有这个bug,已改

[0

【在 w****o 的大作中提到】
: 如果[ 4 1 2 3 ], 上面的代码返回是4,正确应是5, 所以还应有一个判断,是不是a[0
: ]==n

c****9
发帖数: 164
37
不会越界,因为跳过了,不需要额外是space, 是通过判断index的得到结论的,因为n
个元素那个最小的正数肯定在0到n+1的范围。

【在 s*****r 的大作中提到】
: 那如果这样呢 1, 100, 1000,会越界么? 那要多少space?
:
: a[

R******9
发帖数: 267
38
int SmallestMissingPositive(int a[], int n)
{
int i = 0;
int min = MAXINT;
while(i<=n-1){
if(a[i]<=0 || a[i]>n){
a[i] = a[n-1];
n--;
}else{
min = min i++;
}
}
return min;
}

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

n*s
发帖数: 752
39
what if a={100}

【在 R******9 的大作中提到】
: int SmallestMissingPositive(int a[], int n)
: {
: int i = 0;
: int min = MAXINT;
: while(i<=n-1){
: if(a[i]<=0 || a[i]>n){
: a[i] = a[n-1];
: n--;
: }else{
: min = min
H*****1
发帖数: 4815
40
如果是这样,[3, 4, -1, 1]会返回5
答案应该是2

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
相关主题
divide array into two, sum of difference is min in O(N)昨天有人讲过的啥de啥的是怎么回事有人知道么
优步面试,哎。。。算法--找一个unsorted array的largest and second largest 最
Amazon电面面经[算法] unsorted array
进入JobHunting版参与讨论
m******6
发帖数: 82
41
O(n)?

a[

【在 c****9 的大作中提到】
: 有,之前看到过,就是走一遍,遇到a[i]!=i; swap(a[a[i]] a[i]) 走一遍后第一个a[
: i]!=i的就是
: //Input Array:get first positive number that is not in the array
: int getfirstpositive(int* a, int len)
: {
: int i=0;
: while(i: {
: int m= a[i];
: if (m>=0&&m
G**********s
发帖数: 70
42
此题是 given int array in range [1,N],find missing integer的变形吧,
in my opinion
扫描的时候, 用bitmap来mark seen positive ints,略过non-positive的integer,
assume 有k个positive ints, O(n) mark positives,O(k) find first missing int,
gives us O(n+k).
不知道这样做是否妥当和最有呢

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

g**********y
发帖数: 14569
43
这个有问题,过不了test case:
{5, 5, 5, 5, 5}
{1,2,0}
{3,4,-1,1}

【在 R******9 的大作中提到】
: int SmallestMissingPositive(int a[], int n)
: {
: int i = 0;
: int min = MAXINT;
: while(i<=n-1){
: if(a[i]<=0 || a[i]>n){
: a[i] = a[n-1];
: n--;
: }else{
: min = min
g**********y
发帖数: 14569
44
public int find(int[] a) {
int least = a.length;

for (int i=a.length-1; i>=0; i--) {
if (a[i]<=0 || a[i]>i+1) {
least = i;
continue;
}

if (a[i] != i+1) {
if (a[i] == a[a[i]-1]) {
least = i;
}
else {
int t = a[i]-1;
a[i] = a[t];
a[t] = t+1;
i++;
}
}
}

return least+1;
}
A**u
发帖数: 2458
45
大牛,看不懂
可否详解

【在 g**********y 的大作中提到】
: public int find(int[] a) {
: int least = a.length;
:
: for (int i=a.length-1; i>=0; i--) {
: if (a[i]<=0 || a[i]>i+1) {
: least = i;
: continue;
: }
:
: if (a[i] != i+1) {

c*******2
发帖数: 173
46
方法挺好的,但是好像空间不是O(1)吧

int,

【在 G**********s 的大作中提到】
: 此题是 given int array in range [1,N],find missing integer的变形吧,
: in my opinion
: 扫描的时候, 用bitmap来mark seen positive ints,略过non-positive的integer,
: assume 有k个positive ints, O(n) mark positives,O(k) find first missing int,
: gives us O(n+k).
: 不知道这样做是否妥当和最有呢

g**********y
发帖数: 14569
47
http://www.mitbbs.com/article0/JobHunting/31902917_0.html

【在 A**u 的大作中提到】
: 大牛,看不懂
: 可否详解

s****e
发帖数: 638
48
扫描一遍数组,<=0的数字不管,大于数组长度的数字扔掉,其余的重新排列在数组中

扫描第二遍,返回第一个小于等于0的数组index。
int findPosMissing(int* arr, int size) {
for (int i=0; i if (arr[i] == i+1) continue;
int temp = arr[i];
arr[i] = 0;
int temp1;
while (true) {
if (temp <=0 ) break;
if (temp > size ) break;
if (arr[temp-1] == temp) break;
temp1 = arr[temp-1];
arr[temp-1]= temp;
temp = temp1;
}
}
for (int i=0; i if (arr[i]<=0){
return i+1;
}
}
return size+1;
}

【在 H***e 的大作中提到】
: O(n) time, O(1) space?
: 题目是给定一个unsorted int array, 怎么找到第一个大于0,并且不在此array的
: integer。
: 比如[1,2,0] return 3, [3,4,-1,1] return 2

P*A
发帖数: 189
49
if (arr[i]<=0) 有问题,没考虑arr[i]>n
应该改成 if(arr[i]!=i+1)

【在 s****e 的大作中提到】
: 扫描一遍数组,<=0的数字不管,大于数组长度的数字扔掉,其余的重新排列在数组中
: 。
: 扫描第二遍,返回第一个小于等于0的数组index。
: int findPosMissing(int* arr, int size) {
: for (int i=0; i: if (arr[i] == i+1) continue;
: int temp = arr[i];
: arr[i] = 0;
: int temp1;
: while (true) {

i**********e
发帖数: 1145
50
他代码没问题,这里handle了:
if (temp <=0 ) break;
if (temp > size ) break;
另外随手写了一个,基于 cx3959 的思路(除了他没有handle n==0 这个状况之外,他
这个思路是挺简洁的):
int firstMissingPositive(int A[], int n) {
if (n == 0) return 1;
for (int i = 0; i < n; i++)
while (A[i] >= 0 && A[i] < n && A[i] != A[A[i]])
swap(A[i], A[A[i]]);
for (int i = 1; i < n; i++)
if (A[i] != i) return i;
return (A[0] == n) ? n+1 : n;
}
Edit:
火鸡那个思路很巧妙,学习了!

【在 P*A 的大作中提到】
: if (arr[i]<=0) 有问题,没考虑arr[i]>n
: 应该改成 if(arr[i]!=i+1)

相关主题
next larger element in unsorted array问个google面试题
昨天面试的一道题,find k missing numbers求教 合并两数组 并排除重复
re: 面试归来,上面经回馈各位战友新鲜Amazon面经
进入JobHunting版参与讨论
h****n
发帖数: 1093
51
你这个怎么看出来是O(n)的复杂度呢
for里面有个while循环,求解

【在 i**********e 的大作中提到】
: 他代码没问题,这里handle了:
: if (temp <=0 ) break;
: if (temp > size ) break;
: 另外随手写了一个,基于 cx3959 的思路(除了他没有handle n==0 这个状况之外,他
: 这个思路是挺简洁的):
: int firstMissingPositive(int A[], int n) {
: if (n == 0) return 1;
: for (int i = 0; i < n; i++)
: while (A[i] >= 0 && A[i] < n && A[i] != A[A[i]])
: swap(A[i], A[A[i]]);

h****n
发帖数: 1093
52
好像大概明白了,里面while的作用是把数字放到该放的位置上
一共有n个数字,所以里面的while在整个程序里最多执行n次
不知道这么理解对不对

【在 h****n 的大作中提到】
: 你这个怎么看出来是O(n)的复杂度呢
: for里面有个while循环,求解

w***o
发帖数: 109
53
受Rebecca9的启发写一个one pass的。把不在[1..n]之内和重复的放到尾部:
public int firstMissingPositive(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
if(A == null || A.length == 0)
return 1;

int i = 0, n = A.length - 1;
while(i <= n) {
int x = A[i];
if(x == i + 1) {
i++;
continue;
}
if(x <= 0 || x > n + 1|| x == A[x - 1]) {
A[i] = A[n--];
} else {
A[i] = A[x - 1];
A[x - 1] = x;
}
}

return i + 1;
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
Quick selection for k unsorted arrays优步面试,哎。。。
问两道google题Amazon电面面经
问一个merge k sorted array的问题昨天有人讲过的啥de啥的是怎么回事有人知道么
请问两道题算法--找一个unsorted array的largest and second largest 最
有人同看First Missing Positive 吗?[算法] unsorted array
unsorted int array怎么找到第一个大于0,并且不在此array的数next larger element in unsorted array
问个面试题昨天面试的一道题,find k missing numbers
divide array into two, sum of difference is min in O(N)re: 面试归来,上面经回馈各位战友
相关话题的讨论汇总
话题: int话题: return话题: least话题: temp话题: arr