您的位置:首页 > 其它

【LeetCode】Missing Integer第一个丢失的整数 - Medium

2017-10-03 20:10 459 查看
在数组 A 中,包含 0 到 n 的整数,其中缺失了一个数。在这一问题中,我们难以仅用一个操作审查数组 A 中的所有整数。

如:

3,5,1,2,-3,7,14,8

输出4.

【析】

例如:

A[8]=3 < 8 且3>1,则A[8]=3在A[1,2,…,7]中已经出现过 -> 丢弃

A[3] = 8 > 3 且8 将A[ A[3] ] = A[8]与A[3]交换。

若A[3]=8>N,缺失数据A[8],故将A[3]丢弃

i=3, A[ A[3] ] = A[3] = 8; 则无需交换,直接丢弃A[3]

如:

样例中的a[](下标有效位:假设不从0开始!)

①a[1]=3 和a[3]=1互换。++i; ②a[2]=5和a[5]=-3互换,便为a[2]=-3&l
4000
t;0(超出有效位),舍弃: 将最后一位元素(8)覆盖到a[3],同时N-1. –> a[2]=8 ; a[]=1,8,3,2,5,7,14. 现在下标有效位为1~7,a[2]=8>7;a[2]=8继续丢弃:将末尾元素14赋给a[2],N–后,N为6 –> 继续丢弃: a[2]=7,N–后便为5.

-此时 a[] = {1, 7,3,2,5}。

a[2]=7>N=5,丢弃–> 末尾5:a[2]=5, N–后为4。 –>a[2]=5>4 丢弃:a[2]=2,N–后为3,i++

a[i]=a[3]=3. i++,此后i>size.退出循环,i=4

(1)C++

#include <iostream>
#include <cstdlib>

using namespace std;

int FirstMissingNumber(int* a, int size){//需要在原数组上修改,故不可以传入const int* a
if(!a || size == 0) return -1;
a--;//啥意思?
int i = 1;//从1开始数
while(i<=size){
if(a[i] == i){
i++;
}else if(a[i]>size|| a[i]<i /*0*/ ||a[i] == a[a[i]]){
a[i]=a[size];
size--;
}else{
swap(a[i], a[a[i]]);
}
}
return i;
}

int main()
{
int a[] = {3,5,1,2,-3,7,14,8};
int ret = FirstMissingNumber(a, sizeof(a)/sizeof(int));
cout<<ret<<endl;
return 0;
}


(2)Java

在数组 A 中,包含 0 到 n 的整数,其中缺失了一个数。在这一问题中,我们难以仅用一个操作审查数组 A 中的所有整数。 A 中的元素用二进制表示,而唯一可实现的操作是使用固定时间的操作 - “fetch the jth bit of A[i]” 。请编写代码,以查找数组中缺失的整数。你可以在 O(n) 的时间复杂度实现吗?

/**
* Definition of BitInteger:
* public class BitInteger {
*     public static int INTEGER_SIZE = 31;
*     public int fetch(int j) {
*         .... // return 0 or 1, fetch the jth bit of this number
*     }
* }
*/
public class Solution {
/**
* @param array a BitInteger list
* @return an integer
*/
public int findMissing(ArrayList<BitInteger> array) {
/* Start from the least significant bit, and work our way up */
return findMissing(array, 0);
}

public int findMissing(ArrayList<BitInteger> input, int column) {
if (column >= BitInteger.INTEGER_SIZE) { // We're done!
return 0;
}
ArrayList<BitInteger> oneBits = new ArrayList<BitInteger>();
ArrayList<BitInteger> zeroBits = new ArrayList<BitInteger>();
for (BitInteger t : input) {
if (t.fetch(column) == 0) {
zeroBits.add(t);
} else {
oneBits.add(t);
}
}

if (zeroBits.size() <= oneBits.size()) {
int v = findMissing(zeroBits, column + 1);
return (v << 1) | 0;
} else {
int v = findMissing(oneBits, column + 1);
return (v << 1) | 1;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: