算法-丑数2-构造小根堆

int NthUglyNumber(int n) {
    if(n == 1) return 1;
    List<long> arr = new List<long>(); // 这里用list,它会自己扩容,用数组就需要自己操作这些了
    arr.Add(1);
    int[] uglyArr = {2,3,5};
    HashSet<long> hs = new HashSet<long>();
    hs.Add(1);
    HeapInsert(arr,0);
    long result = 0;
    for(int i=0;i<n;i++)
    {
        result = heapPop(arr);
        foreach(var y in uglyArr)
        {
            long temp = result*y;
            if(!hs.Contains(temp))
            {
                hs.Add(temp);
                arr.Add(temp);
                HeapInsert(arr,arr.Count -1);
            }
        }
    }
    return (int)result;
}
long heapPop(List<long> arr)
{
    swap(arr,arr.Count-1,0);
    var rt =  arr[arr.Count-1];
    arr.RemoveAt(arr.Count-1);
    // 这里传递0 ,heapSize是数量
    HeapifyS(arr,arr.Count,0);
    return rt;
}
void HeapifyS(List<long> arr,int heapSize,int i)
{
    var left = 2*i + 1;
    // 表示有孩子
    while(left < heapSize)
    {
        var largest = left + 1 < heapSize && arr[left + 1] < arr[left] ? left + 1 : left;
        largest = arr[i] < arr[largest] ? i : largest;
        if(largest == i){
            break;
        }
        swap(arr,i,largest);
        i = largest;
        left = i*2+1;
    }   
}
// 构造小根堆
void HeapInsert(List<long> arr,int index)
{
    while (index > (index - 1) / 2 && arr[index] < arr[(index - 1) / 2])
    {
        swap(arr, index, (index - 1)/2);
        index = (index - 1) /2;
    }
}

void swap(List<long> arr,int i,int j)
{
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

 

posted @ 2023-04-15 10:07  vba是最好的语言  阅读(10)  评论(0编辑  收藏  举报