【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++
(2)Java
在数组 A 中,包含 0 到 n 的整数,其中缺失了一个数。在这一问题中,我们难以仅用一个操作审查数组 A 中的所有整数。 A 中的元素用二进制表示,而唯一可实现的操作是使用固定时间的操作 - “fetch the jth bit of A[i]” 。请编写代码,以查找数组中缺失的整数。你可以在 O(n) 的时间复杂度实现吗?
如:
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; } } }
相关文章推荐
- LeetCode--First Missing Positive (第一个丢失的正整数)Python
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- LeetCode | First Missing Positive(第一个缺失的正整数)
- LintCode : 第一个丢失的正整数 First Missing Positive
- LeetCode 41 First Missing Positive(找到数组中第一个丢失的正数)
- [LeetCode] 找到第一个不存在的正整数 First Missing Positive
- First Missing Positive(在数组中找到第一个丢失的正整数)
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- First Missing Positive (寻找第一个丢失的正数)【leetcode】
- LeetCode Integer to English Words(整数转化为英文字母)
- leetcode 7. Reverse Integer(C语言,翻转一个整数,判断是否溢出)19
- Leetcode 343. Integer Break (Medium) (cpp)
- leetCode 12.Integer to Roman (整数转罗马数字) 解题思路和方法
- [LeetCode-7] Reverse Integer(反转整数)
- 寻找失踪的整数数组(Find the missing integer)
- LeetCode 12 Integer to Roman (整数转罗马数字)
- 丢失的第一个整数
- LeetCode刷题(C++)——String to Integer (atoi)(Medium)
- 找到数组中第一个不见的正整数(First Missing Positive )
- leetcode-8-String to Integer (atop)字符串转整数