寻找最小的整数

题目:给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间

解答:不停的让a[i] =i  归位。

#include <stdio.h>
void Swap(int &a, int &b)
{
  int c = a;
  a = b;
  b = c;
}
int FindFirstNumberNotExistenceInArray(int a[], int n)
{
  int i;
  for (i = 0; i < n; i++)
    while (a[i] > 0 && a[i] <= n && a[i] != i + 1 && a[i] != a[a[i] - 1])
        Swap(a[i], a[a[i] - 1]);
  for (i = 0; i < n; i++)
    if (a[i] != i + 1)
      break;
  return i + 1;
}
void PrintfArray(int a[], int n)
{
  for (int i = 0; i < n; i++)
    printf("%d ", a[i]);
  putchar(‘\n‘);
}
int main()
{
 const int MAXN = 5;
  int a[MAXN] = {2, -100, 4, 1, 70};
  PrintfArray(a, MAXN);
  printf("该数组缺失的数字为%d\n", FindFirstNumberNotExistenceInArray(a, MAXN));
  return 0;
}

参考:http://blog.csdn.net/morewindows/article/details/12683723

时间: 2024-10-11 23:13:34

寻找最小的整数的相关文章

寻找最小的K个数

寻找最小的K个数 题目描述:查找最小的K个数 题目:输入n个整数,输出其中最小的K个数 例如,输入1.2.3.4.5.6.7.8这8个数字,则最小的4个数字为1.2.3.4. 第一节.各种思路,各种选择 要求一个序列中最小的K个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的K个数即可: 至于选取什么样的排序方法,第一时间应该想到的是快速排序,我们知道,快速排序平均时间复杂度为O(nlogn),然后再遍历序列中前K个元素输出,即可,总的时间复杂度为O(nlogn +

十大基础实用算法之寻找最小(最大)的k个数-线性查找算法

例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前面的最小的k个数即可.如果选择快速排序法来进行排序,则时间复杂度:O(n*logn) 注:针对不同问题我们应该给出不同的思路,如果在应用中这个问题的规模不大,或者求解前k个元素的频率很高,或者k是不固定的.那么我们花费较多的时间对问题排序,在以后是使用中可以线性时间找到问题的解,总体来说,那么思路一的解法是最优的. 思路2:在思路1的基础上更进一步

4137:最小新整数

查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?例如: n = 9128456, k = 2, 则生成的新整数最小为12456 输入 第一行t, 表示有t组数据:接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k. 输出 t行,每行一个数字,表示从n中

3528:最小新整数

描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?例如: n = 9128456, k = 2, 则生成的新整数最小为12456 输入第一行t, 表示有t组数据:接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k.输出t行,每行一个数字,表示从n中删除k位后得到的最小整数.样例输入 2 9128456 2 1444 3 样例输出 12456

4.6算法之贪心-3528:最小新整数

描述 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?例如: n = 9128456, k = 2, 则生成的新整数最小为12456 输入第一行t, 表示有t组数据:接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k.输出t行,每行一个数字,表示从n中删除k位后得到的最小整数.样例输入 2 9128456 2 1444 3 样例输出 12456

寻找最小的k个数(大顶堆方法)

题目描述:查找最小的k个元素,输入n个整数,输出其中最小的k个. 一般的排序方法,如快排,时间复杂度为O(n*logn+k); 大顶堆方法,时间复杂度为O(k+(n-k)*logk); 如果建立k个元素的最小堆的话,那么其空间复杂度势为O(N),而建立k个元素的最大堆的空间复杂度为O(k); 当面对海量数据处理的时候,大顶堆的方法是较为靠谱的,并且可以在面试时短时间内完成代码. 1 class Solution { 2 public: 3 void Swap(int &a,int &b)

寻找最小的k个数(update)

类似编程之美中寻找最大的k个数 解法一: 题目没有要求最小的k个数有序,也没要求最后n-k个数有序.既然如此,就没有必要对所有元素进行排序.这时,咱们想到了用选择或交换排序,即: 1.遍历n个数,把最先遍历到的k个数存入到大小为k的数组中,假设它们即是最小的k个数: 2.对这k个数,利用选择或交换排序找到这k个元素中的最大值kmax(找最大值需要遍历这k个数,时间复杂度为 O(k) ): 3.继续遍历剩余n-k个数.假设每一次遍历到的新的元素的值为x,把x与kmax比较:如果 x < kmax

小算法---寻找最小的不能由n个数选取求和的数

题目描述如下: 看到这个题目,最容易想到的是暴力搜索法.然而,那不是好的办法,也是acm无法通 过的办法. 思路分析:对于给定的数组,我们必须先对其进行小到大的排序.如果最小的数不是 1(大于1),输出的结果必然就是1啦.如果是1,通过当前数与前边所有数的和加1进 行比较,如果当前数小于等于前边数的和加1,那么当前数也是可以找到它的几个因数 的:否则,直接返回前边数的和加1.跳出循环的有两种情况,break和循环终止条件,如 果是终止条件出来的,那就是说明从1到数组中所有元素的和,都可以找到它的

寻找最小的k个数(四种方法)

1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) { if(k>n) return; priority_queue<int> q; for(int i=0;i<n;++i) { if(q.size()<k) q.push(arr[i]); else { if(arr[i]<q.top()) { q.pop(); q.pu