数据结构--ArrayList13 求数组中未出现的最小正整数

博客给出一个算法题目,要求设计时间上尽可能高效的算法,找出含n个整数的数组中未出现的最小正整数,并给出示例。还提到源码中使用自己实现的ArrayList,给出了其源码地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)题目:给定一个含n(n>=1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4

2)思路与代码:

源码中使用到的ArrrayList,是调用的是自己实现的ArrayList,自己实现的ArrayList源码地址:https://blog.youkuaiyun.com/u012441545/article/details/89667486

package com.sam.datastruct.arrayList;

import java.util.HashSet;
import java.util.Set;

public class P2_13 {
   /*
    * 思路:使用Java set自带的contains方法查看数值是否存在
    * 时间复杂度O(nlogn)
    * 空间复杂度O(1)*/
   public Integer function(int[] s){
      Set<Integer> exist = new HashSet<>();
      for (int i : s) {
         if (i > 0) {
            exist.add(i);
         }
      }
      for (int i = 1; i <= Integer.MAX_VALUE; ++i) {
         if (!exist.contains(i)) {
            return i;
         }
      }
      return -1;
      
   }
   
   /*
    * 思路:使用位图记录数据是否存在的信息,因为每个int有32个bit,故可以记录32个数据的存在情况
    * 时间复杂度O(n)
    * 空间复杂度O(1)*/
   public Integer function1(int[] s){
      int[] exist = new int[Integer.MAX_VALUE/32];
      for (int i : s) {
         if (i > 0) {
            exist[i/32] |= 1<<i%32;    //数据i的信息记录在exist数组的第i/32个数据的第i%32位上 |= 表示左边与右边做或运算并将结果赋予左边,1<<n表示1左移n位,即乘以2^n
         }
      }
      for (int i = 1; i <= Integer.MAX_VALUE; ++i) {
         if ((exist[i/32] & (1<<i%32)) == 0) {
            return i;
         }
      }
      return -1;
   }
   /*
    * 思路:使用数组记录1到最大值间数据是否出现,之后遍历找出未出现的第一个数据,如果没有则返回最大值+1
    * 时间复杂度O(n)
    * 空间复杂度O(1)*/
   public int function2(int[] s){
      int maxValue = s[0];
      for (int i : s) {
         if (i > maxValue) {
            maxValue = i;
         }
      }
      int[] exist = new int[maxValue + 1];
      for (int i : s){
         if (i > 0) {
            exist[i] = 1;
         }
      }
      for (int i = 1; i <= maxValue; ++i){
         if (exist[i] == 0) {
            return i;
         }
      }
      return maxValue + 1;
   }
   
   public static void main(String[] args) {
      P2_13 p = new P2_13();
      int size = 100;
      int[] s = new int[]{0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,50,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,50,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,50,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5,0,5,5,3,5,7,5,5,0,0,0,5,5,6,4,5,5,5,4,5,4,2,5,4,5,5,2,1,6,5,5,7,5};
      /*Random random = new Random();
      for(int i = 0; i < size; ++ i){
         s[i] = 1 + random.nextInt(2);
      }*/
      for(int integer : s){
         System.out.print(integer + ", ");
      }
      System.out.println();
      long t1 = System.nanoTime();
      System.out.println(p.function(s));
      System.out.println(System.nanoTime() - t1);
      t1 = System.nanoTime();
      System.out.println(p.function1(s));
      System.out.println(System.nanoTime() - t1);
      t1 = System.nanoTime();
      System.out.println(p.function2(s));
      System.out.println(System.nanoTime() - t1);
   }

}
public class PrimeCounter { /** * 方法一:埃拉托斯特尼筛法统计不超过n的素数个数 * @param n 目标正整数 * @return 素数个数 */ public static int sieveOne(int n) { if (n < 2) { return 0; } // 标记数组:isPrime[i]为true表示i是素数 boolean[] isPrime = new boolean[n + 1]; Arrays.fill(isPrime, true); // 0和1不是素数 isPrime[0] = false; isPrime[1] = false; // 从2开始筛除合数 for (int p = 2; p * p <= n; p++) { // 仅处理被筛除的素数p if (isPrime[p]) { // 筛除p的倍数(从p^2开始避免重复标记) for (int i = p * p; i <= n; i += p) { isPrime[i] = false; } } } // 统计剩余素数数量 int count = 0; for (boolean prime : isPrime) { if (prime) { count++; } } return count; } /** * 方法二:欧拉筛(线性筛)统计不超过n的素数个数 * @param n 目标正整数 * @return 素数个数 */ public static int sieveTwo(int n) { if (n < 2) { return 0; } // 标记数组:isComposite[i]为true表示i是合数 boolean[] isComposite = new boolean[n + 1]; // 存储已找到的素数列表 List<Integer> primes = new ArrayList<>(); for (int i = 2; i <= n; i++) { // 若i被标记为合数,则i是素数 if (!isComposite[i]) { primes.add(i); } // 用当前素数列表中的素数标记i的乘积 for (int p : primes) { int product = i * p; // 乘积超出范围时停止当前循环 if (product > n) { break; } // 标记乘积为合数 isComposite[product] = true; // 当i能被p整除时,p是i的最小质因数,停止标记 if (i % p == 0) { break; } } } return primes.size(); } } 请针对该类写出测试方法,并符合谷歌编码规范
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值