当前位置: 首页 > article >正文

用堆求解最小可用ID问题

题目

在非负数组(乱序)中找到最小的可分配的id(从1开始编号)数据是1000000

分析

第一个最小值是1,第二个最小值是2,第三个最小值是4.那么最小可用ID是3.
可以用小顶堆求每次的最小值。

package com.company;

import com.company.util.ArrayUtil;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args) {
	    // write your code here
        int[] A={1,2,3,4,6,7,8,9,10};
//        int[] A=ArrayUtil.randomArray(-10,10,10);
        int len;
        len=A.length;
        heapify(A,len);
        int counter;
        int oldLen=A.length;
        for ( counter = 1; counter <=oldLen-1 ; counter++) {
            int min=A[0];
            if(min!=counter){
                System.out.println(counter);
                break;
            }
            ArrayUtil.swap(A,0,len-1);
            len--;
            heapify(A,len);



        }
        if(counter==oldLen){
            System.out.println(A[0]+1);
        }



    }
    public static void heapify(int[]A,int len){
        for (int i =len/2 ; i >=0 ; i--) {
            int left=2*i+1;
            int right=2*i+2;

            int min=i;
            if(left<len&&A[left]<A[i]){
                min=left;
            }
            if(right<len&&A[right]<A[i]){
                min=right;
            }

            if(min!=i){
                down(A,i,len);
            }


        }
        System.out.println(Arrays.toString(A));
    }
    private static void down(int[]heap,int parent,int len) {
        int size=len;
        int leftChild = parent*2 + 1;
        int rightChild = parent*2 + 2;
        int min = parent;
        if (leftChild < size && heap[min] > heap[leftChild]) {
            min = leftChild;
        }
        if (rightChild < size && heap[min] > heap[rightChild]) {
            min = rightChild;
        }
        if (min != parent) {
            ArrayUtil.swap(heap,min, parent);
            down(heap,min,size);
        }
    }








}


http://www.kler.cn/a/416861.html

相关文章:

  • 智能化Kubernetes管理:AI与ChatGPT提升运维效率的创新实践
  • 【Java基础面试题001】Java中序列化和反序列化是什么?
  • 安装Fcitx5输入框架和输入法自动部署脚本(来自Mark24)-Ubuntu通用
  • 设计模式 外观模式 门面模式
  • 软通动力携子公司鸿湖万联、软通教育助阵首届鸿蒙生态大会成功举办
  • Tülu 3:重新定义开源大模型的后训练范式
  • C++ 之弦上舞:string 类与多样字符串操作的优雅旋律
  • 面向数字音视频的网络与操作系统技术研讨会 征稿通知
  • Qt 项目中同时使用 CMAKE_AUTOUIC 和 UiTools 的注意事项
  • 泷羽Sec-星河飞雪-BurpSuite之解码、日志、对比模块基础使用
  • 频繁发生Full GC的原因有哪些?如何避免发生Full GC
  • vue3创建
  • 使用PyQt5开发一个GUI程序的实例演示
  • 解决“磁盘已插上,但Windows系统无法识别“问题
  • 记一次 .NET某hdp智能柜系统 卡死分析
  • el-selet下拉菜单自定义内容,下拉内容样式类似表格
  • ChatGPT的应用场景:开启无限可能的大门
  • apache实现绑定多个虚拟主机访问服务
  • Vue项目运行步骤(详细图解)
  • 静态页面 和 动态页面(Java Web开发)
  • 【Linux网络编程】第三弹---UDP网络通信深度解析:构建服务器端、客户端,并实现两端通信的完整步骤与测试
  • 【传感器技术】第6章 压电式传感器
  • [python脚本处理文件入门]-18.使用Python进行PDF文件的合并与拆分
  • 浅谈volatile
  • Mybatis:CRUD数据操作之修改数据update
  • 【QT/MinGW/.a->.lib】如何将一个用QT的MingGW编译dll项目出的dll文件导出一份.lib文件给其他项目链接动态库用