数组堆化

今天学习了数组堆化, 堆化启发我们的思维, 百尺竿头更进一步!

理解堆化

说是堆化, 其实就是利用树的性质表示在数组中, 利用下标和书上左右孩子对应关系.

公式

  • 左孩子下标 = 根下标 * 2 + 1
  • 右孩子下标 = 根下标 * 2 + 2

递归

递归 fixHead 函数来解决满足大顶堆或者小顶堆的问题, 说到递归, 我们一般会说递归结束条件, 数组越界或者已经符合条件, 结束递归.

源码

public class Main {
    public static void main(String[] args) {
        int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ,0};
        for (int i = arr.length / 2 - 1; i > -1; i--) {
            fixHead(arr, i, arr.length - 1);
        }
    }

    public static void fixHead(int[] arr, int headIndex, int limitIndex) {
        int leftChildIndex = headIndex * 2 + 1;
        int rightChildIndex = headIndex * 2 + 2;
        if (leftChildIndex > limitIndex || rightChildIndex > limitIndex) {
            return;
        }
        int selectIndex = -1;
        if (arr[leftChildIndex] <= arr[rightChildIndex]
                && arr[leftChildIndex] < arr[headIndex]) {
            selectIndex = leftChildIndex;
        }
        if (arr[rightChildIndex] <= arr[leftChildIndex]
                && arr[rightChildIndex] < arr[headIndex]) {
            selectIndex = rightChildIndex;
        }
        if (selectIndex != -1) {
            int tempValue = arr[selectIndex];
            arr[selectIndex] = arr[headIndex];
            arr[headIndex] = tempValue;
            fixHead(arr, selectIndex, limitIndex);
        }
    }
}

结果

输入:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
输出:
[0, 1, 4, 2, 6, 5, 8, 3, 7, 9, 10]

原文地址:https://www.cnblogs.com/haqueo/p/11483137.html

时间: 2024-08-06 19:14:33

数组堆化的相关文章

面试题9:数组堆化、堆的插入、堆的删除、堆排序

参考:白话经典算法系列之七 堆与堆排序 1 #include <iostream> 2 #include <climits> 3 #include <vector> 4 using namespace std; 5 6 namespace heap { 7 8 //insert an element to a heap 9 void insertToHeap(vector<int>& h, int x) { 10 h.push_back(x); 11

深拷贝和数组扁平化

这两天做笔试题的时候遇到了深拷贝,在js中,一些基本类型是存在栈空间里的,而引用类型如object function之类的都是存在堆内存之中,只不过是他们的地址是在栈内存,通过地址找到对内存空间中的数据 上代码 function deepClone(obj){ var cloneobj = Array.isArray(obj)?[]:{}; //判断是数组还是对象 if(obj && typeof obj === "object"){ //判断当前的对象是否存在且类型是

2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

1012 World is Exploding 题意:选四个数,满足a<b and A[a]<A[b]   c<d and A[c]>A[d] 问有几个这样的集合 思路: 树状数组+离线化 先处理出每个数左边比它小 大,右边比它大 小的数目,用cnt[][i]表示.最后统计一下减去重复的就可以 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <

js数组拍平(数组扁平化)的五种方式

1.数组拍平也称数组扁平化,就是将数组里面的数组打开,最后合并为一个数组 2.实现 var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; a:递归实现 function fn(arr){ let arr1 = [] arr.forEach((val)=>{ if(val instanceof Array){ arr1 = arr1.concat(fn(val)) }else{ arr1.push(val) } }) return arr1 } b:reduc

数组扁平化的几种处理放法

清明节,这几天放假闲来无事,好好研究一下基础知识,今天看看数组扁平化该怎么处理: 先来看数组扁平化是什么: var arr = [1,2,3,4,[5,6,[7,8]],true] => [1,2,3,4,5,6,7,8,true] 就是把二维或者多维数组,转成一维数组. 1.我想大部分同学会和一样,首先想到的肯定是遍历数组,如果某一项是基本数据类型,直接push到新数组,如果某一项是数组,则直接将这一项concat到新的数组上,当然如果是多维数组,还得用上递归的方法,继续往下层寻找,上代码:

已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组 var dt= arr.toString().split(",").sort(function(a,b){return a-b}).map(Number);Array.from(new Set(dt)) 代码如下 var d

数组扁平化的五种方法

数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5] 实现 1. reduce 参数 callback 执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数: accumulator累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方).currentValue数组中正在处理的元素.index 可选数组中正在处理的当前元

D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个问题: 数轴上有个点突然兴奋,如果自己被身上覆盖了超过条线段,这个点就会浑身难受然后把Koishi批判一番. Koishi十分善良,为了不让数轴上的点浑身难受,也为了让自己开心,她想在数轴上放入尽量多的线段. 按照套路,Koishi假装自己并不会做这道题,所以她就来求你帮忙.并承诺如果你解决了问题就

FCC 中级算法题 数组扁平化

Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数组连接; (2)如果不是数组,就直接添加进新数组: 知识点: (1)Array.concat()方法用于合并两个或多个数组.此方法不会更改现有数组,而是返回一个新数组; (2)Array.push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度; (3)Array.isArray()用于